我们有一个方法,它使用表名并对列进行操作。此方法之前使用的是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.But,在Postgres中打印出一个空字符串。
我甚至尝试了递归CTE,如下所示。
with sub as((select * from users2 limit 1)
union (select * from users limit 1)) select * from sub;
问题
请注意,我不想在这里查看视图,这只是一次性使用。我也无法修复底层方法,因为它会导致所有使用代码的代码更改。
有没有快速解决方法?
答案 0 :(得分:2)
ResultSetMetaData.getTableName
不应该返回表的别名,它应该返回实际的源表名(如果可用)。这也是为什么在MySQL中您需要明确使用useOldAliasMetadataBehavior=true
来获取此信息的原因。
从JDBC规范的角度来看,PostgreSQL的行为更好。 union不能具有列的表名,因为结果集中单个列中的值可能来自完全不同的表。据我所知,PostgreSQL没有选项可以返回您期望的信息。