mysql - Postgres JDBC 的表名别名

标签 mysql postgresql jdbc

我们有一个使用表名并对列进行操作的方法。此方法以前用于 MySQL,但在 postgres 中将空白作为表名。

我在下面提供了一个非常简单的 SQL 查询来演示。

select * from ((select * from users2 limit 1) 
union (select * from users limit 1)) as sub;

演示获取表名的代码。

 try{
        connection = DriverManager.getConnection(
                connectionURL, dbUserName,
                dbPassword);



        PreparedStatement psmt = connection.prepareStatement("select * from ((select * from users2 limit 1) union (select * from users limit 1)) as sub");

        ResultSet rs = psmt.executeQuery();

        ResultSetMetaData metaData = rs.getMetaData();

        System.out.println("Table Name");
        System.out.println("----------");

        System.out.println(metaData.getTableName(1));


    }

在连接参数为 ?useOldAliasMetadataBehavior=true 的 MYSQL 中,它将表名打印为 sub。但在 Postgres 中,它打印出一个空字符串。

我什至尝试了如下递归 CTE。

with sub as((select * from users2 limit 1) 
union (select * from users limit 1)) select * from sub;

问题

  • 如何获取表名作为别名?在 MYSQL 中,它由一个参数控制,是否有与 Postgres 等效的东西?
  • 是否可以更改查询中的任何内容,以便结果集元数据返回别名表名。

请注意,我不想在这里查看,这只是一次使用。我也无法修复底层方法,因为它会导致对所有使用代码的代码更改。

有什么快速的方法可以解决这个问题吗?

最佳答案

ResultSetMetaData.getTableName 不应该返回表的别名,它应该返回实际的源表名称(如果可用)。这也是为什么在 MySQL 中您需要显式使用 useOldAliasMetadataBehavior=true 来获取此信息的原因。

从 JDBC 规范的角度来看,PostgreSQL 的行为更好。联合的列不能有表名,因为结果集中单个列中的值可能来自完全不同的表。据我所知,PostgreSQL 没有返回您期望的信息的选项。

关于mysql - Postgres JDBC 的表名别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34590432/

相关文章:

mysql - 是否可以将 MySQL 5.7.21 数据库导入到 MySQL 5.6.38 设置中?

mysql - 使用mysql查找第一行计数和第二行计数

php - 解码 php 不工作

java - 根据同一行中的另一列更新 sql 列

java - 如何使用 JPA native 查询选择具有相同名称的多个列?

重启后 MySQL 不工作

r - 在 Linux 上为 R 安装 PostgreSQL 包时没有这样的文件错误 libpq-fe.h

postgresql - "sslmode=allow host=localhost dbname=test"在PSQL中不起作用,试图将PSQL连接到VSCode

postgresql - echo 在运行时从文件中查询 psql

java - jdbc中的外键问题