如何在DB2中引用隐式命名的列

时间:2019-05-07 12:07:30

标签: sql db2 db2-luw

在DB2 LuW中,我正在运行以下查询

db2 => select 'a', 'b' from sysibm.dual

1 2
- -
a b

  1 record(s) selected.

请注意,生成的“列名”是从1开始的列索引。现在,如果我有诸如派生表之类的查询,就不能简单地像这样通过它们的索引来引用列名:

db2 => select t."1", t."2" from (select 'a', 'b' from sysibm.dual) t
SQL0206N  "T.1" is not valid in the context where it is used.  SQLSTATE=42703

尽管数字列别名是可能的,但这仍然可行:

db2 => select t."1", t."2" from (select 'a' as "1", 'b' as "2" from sysibm.dual) t

1 2
- -
a b

  1 record(s) selected.

或者,使用派生的列列表:

select t."1", t."2" from (
  select 'a', 'b' from sysibm.dual
) t("1", "2")

是否可以在不修改原始查询的情况下引用生成的列名/索引,也不必将其包装在派生表中(这可能会导致失去顺序等副作用)?

请注意,原始查询可能不受我的控制,因为它是由其他逻辑提供的,例如在jOOQ

的上下文中

3 个答案:

答案 0 :(得分:0)

我认为JOOQ很棒。我们还有另一个产生实时SQL的ORM,我们也遇到过同样的问题。我们最终要做的是将Java类分成两个非常不同的SELECT

  • 常规选择。接受“列”和“命名列”。
  • 全名SELECT 。仅接受“命名列”。

本质上,我们的API强制在某些子查询(例如CTE)上使用第二个查询,因此用户被迫使用表/视图列(按定义命名),或者将别名强制添加到他们产生的任何自由表达式中。

这样,任何外部查询都可以始终按其名称检索子查询列。

我尝试在SQL中执行此操作,但找不到任何标准的SQL方法来检索未命名的子查询列。

答案 1 :(得分:0)

您不能在Db2中引用未命名(使用系统生成的名称)列。

答案 2 :(得分:0)

“...您不能在 Db2 中引用未命名(使用系统生成的名称)列...”

如何使用公用表表达式?

select 'a', 'b' from sysibm.dual;
/*
1 2
- -
a b
*/

WITH cte(FIRST_COL, SECOND_COL) AS (SELECT 'a', 'b' FROM sysibm.dual)
SELECT FIRST_COL, SECOND_COL FROM   cte;
/*
FIRST_COL SECOND_COL
--------- ----------
a         b
*/