【问题标题】:Table Name alias with Postgres JDBCPostgres JDBC 的表名别名
【发布时间】:2016-01-04 11:45:29
【问题描述】:

我们有一个使用表名并对列进行操作的方法。此方法以前用于 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 有什么等价的吗?
  • 是否可以更改查询中的任何内容,以便结果集元数据返回别名表名称。

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

有什么快速的解决方法吗?

【问题讨论】:

    标签: mysql postgresql jdbc


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您提供的信息。它返回的是一个空字符串,而不是 null,在问题中对其进行了错误的编辑。所以 postgres 的行为更好,必须说服我的队友。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多