PostgreSQL JDBC中的表名别名

3
我们有一个方法,它消耗表名并操作列。这个方法以前在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));


    }

在MYSQL中,使用连接参数?useOldAliasMetadataBehavior=true时,它会将表名打印为sub。但在Postgres中,它会打印一个空字符串。
我甚至尝试了下面的递归CTE。
with sub as((select * from users2 limit 1) 
union (select * from users limit 1)) select * from sub;

问题

  • 如何将表名作为别名?在MYSQL中,可以通过参数来控制,那么在Postgres中是否有相应的方式?
  • 是否可以更改查询语句中的任何内容,以便结果集元数据返回别名表名称。

请注意,我不想在这里使用视图,这只是一次性使用。我也不能修复基础方法,因为这会导致所有使用代码的代码更改。

有没有快速的方法来解决这个问题?

1个回答

2
ResultSetMetaData.getTableName 不应该返回表的别名,它应该返回实际源表的名称(如果有的话)。这也是为什么在MySQL中需要显式使用 useOldAliasMetadataBehavior=true 来获取此信息的原因。
从JDBC规范的角度来看,PostgreSQL的行为更好。一个联合查询不能对列使用表名,因为结果集中单个列中的值可能来自完全不同的表。据我所知,PostgreSQL没有选项可以返回您期望的信息。

谢谢提供这个信息。它返回的是一个空字符串,而不是null,我会在问题中进行编辑。所以Postgres的行为更好,我得说服我的团队成员。 - Greedy Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接