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

Sql 如何在DB2中引用隐式命名的列,sql,db2,db2-luw,Sql,Db2,Db2 Luw,在DB2LUW中,我运行以下查询 db2=>从sysibm.dual中选择“a”、“b” 1 2 - - a b 选择1条记录。 请注意,生成的列名是以1开头的列索引。现在,如果我有一个派生表这样的查询,我不能简单地通过它们的索引引用列名,如下所示: db2=>从sysibm.dual t中选择“a”和“b”,从中选择t.1和t.2 SQL0206N T.1在使用它的上下文中无效。SQLSTATE=42703 尽管数字列别名是可能的,但这是可行的: db2=>从中选择t.1、t.2,从sysib

在DB2LUW中,我运行以下查询

db2=>从sysibm.dual中选择“a”、“b” 1 2 - - a b 选择1条记录。 请注意,生成的列名是以1开头的列索引。现在,如果我有一个派生表这样的查询,我不能简单地通过它们的索引引用列名,如下所示:

db2=>从sysibm.dual t中选择“a”和“b”,从中选择t.1和t.2 SQL0206N T.1在使用它的上下文中无效。SQLSTATE=42703 尽管数字列别名是可能的,但这是可行的:

db2=>从中选择t.1、t.2,从sysibm.dual t中选择“a”作为1、选择“b”作为2 1 2 - - a b 选择1条记录。 或者,使用派生列列表:

从中选择t.1、t.2 从sysibm.dual中选择“a”、“b” t1,2 是否有任何方法可以引用生成的列名/索引,而不修改原始查询,也不将其包装到派生表中,这可能会产生副作用,例如丢失顺序


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

的上下文中,我认为JOOQ非常好。我们有另一个生成实时SQL的ORM,我们也面临同样的问题。我们最终要做的是将Java类分成两个完全不同的选择:

一般选择。接受列和命名列。 全名选择。只接受命名列。 本质上,我们的API强制在某些子查询CTE上使用第二个,例如,因此用户被迫使用按定义命名的表/视图列,或者强制向他们生成的任何自由表达式添加别名

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


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

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

…在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
*/

“是否有任何方法可以在不修改原始查询的情况下引用生成的列名/索引,也不要将其包装在派生表中,这可能会产生一些副作用,例如失去顺序?”告诉你一个没有顺序的商业秘密,因为SQL结果集按照SQL标准是无顺序的,因此没有任何顺序可以信任,事实上,结果集是非皮肤病随机的。获得真正皮肤病固定结果的唯一有效方法是在order by中包含具有主键或唯一键的列,或使用已知具有唯一键的列values@RaymondNijland:谢谢,雷蒙德,我很理解。不过,这完全不是问题所在:我知道我还是想警告你,如果你生成一个数组[“a”,“b”],并使用数字数组索引来选择你需要的项,会怎么样?我猜只有在生成结果集时,才会将1,2等添加为列标签,而不是在中间结果中。列名仍然存在,不一定。我猜在派生表中没有列名,在顶级select中也没有列名,而且这些名称的存在可能只是为结果集生成的元数据的产物,例如,在一个未命名的列中,我们使用它的位置作为名称。谢谢。不过,这并不能真正回答我的问题:在jOOQ的情况下,API中的这种抽象是没有意义的,而且几乎不需要它,就像在SQL中一样,因为大多数查询都可以转换为合适的替代方法。@LukasEder是的,这是一种变通方法。我们无法找到仅在SQL中正确执行此操作的任何方法。同样,在大多数情况下,很容易模拟特定行为,包括为特定目的生成合成列名。也许,您应该在jOOQ之上构建ORM-@卢卡塞德:我认为我的答案是如此具体,以解决代码生成器的问题。我想知道有多少人会真正理解问题的症结所在。我只是在一个周五的下午想知道。当然,我们可以将SQL转换成完全不同的东西,但这可能不是用户所期望的。你的问题是:有没有办法在不修改原始查询的情况下引用生成的列名/索引,也不将其包装在派生表中,这可能会产生副作用,例如失去顺序?使用CTE不会修改原始查询的属性。没有副作用,如失去秩序。不必转换原始查询。用户的期望是什么?在我的例子中,用户是用jOOQ编写这个查询的用户,这个查询有一个没有任何实际列名的投影。将列重命名为特定的名称可能会有很多微妙的边大小写副作用,这就是为什么我想阻止它。。。