在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
的上下文中答案 0 :(得分:0)
我认为JOOQ很棒。我们还有另一个产生实时SQL的ORM,我们也遇到过同样的问题。我们最终要做的是将Java类分成两个非常不同的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
*/