【问题标题】:ResultSetMetaData.getColumnName returns different values for UNION and non-UNION queriesResultSetMetaData.getColumnName 为 UNION 和非 UNION 查询返回不同的值
【发布时间】:2014-05-15 13:12:42
【问题描述】:

使用 Java JDBC,我想收集 SQL Select 查询返回的信息。

如果我在 SQL 查询下触发:

SELECT col1 AS 'Field1', col2 AS 'Field2' FROM Table;

然后,使用 resultSetMetaData.getColumnName(1),我得到 'col1' 作为结果,这是预期的结果。

现在,问题是,当我加入 2 个 SQL 表时(由于 MySQL 不提供完全外连接,因此我触发了以下查询)

SELECT Table1.Col1 AS 'Field1', Table1.Col3 AS 'Field2',
Table2.Col5 AS 'Field3',Table2.Col4 AS 'Field4' FROM Table1 
LEFT JOIN Table2 ON Table1.id = Table2.id 
UNION 
SELECT Table1.Col1 AS 'Field1', Table1.Col3 AS 'Field2', 
Table2.Col5 AS 'Field3',Table2.Col4 AS 'Field4' FROM Table1 
RIGHT JOIN Table2 ON Table1.id = Table2.id;

现在,使用 resultSetMetaData.getColumnName(1),我得到 'Field1' 作为结果,而我预期的是 'col1'。

我也尝试了 resultSetMetaData.getColumnLabel(1),但它仍然返回 'Field1'。

我想要 'col1' 作为结果,我无法通过 resultSetMetaData 的任何方法获得。

对此的任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试过在查询中不使用别名?

标签: java mysql jdbc


【解决方案1】:

您看到这些结果是因为它是一个 UNION 查询。这样的查询完全有可能做类似的事情

SELECT Col1 AS Field1 FROM Table1
UNION
SELECT Col2 AS Field1 FROM Table2

在这种情况下,如果getColumnName 尝试在结果中返回基础列的名称,则没有单一的“正确”答案:它应该返回“Col1”还是“Col2”?

由于 UNION 查询的结果集中的任何列都可以从多个基础列派生,getColumnName 只能返回该列的有效名称,即上例中的Field1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2020-08-24
    • 2012-03-06
    • 1970-01-01
    相关资源
    最近更新 更多