我试图理解,在不同的地方使用子查询时,SQL中特定列的范围是什么。例如
select (case(val)
when 1 then 'one'
when 2 then 'two'
else 'something else'
end) as description, val
from (select 1 as val from dual);
使用此查询,val在select语句中可用,结果为
Description | Val
-------------------
one | 1
但是使用以下查询
select (case(val)
when 1 then 'one'
when 2 then 'two'
else 'something else'
end) as description,
(select 1 from dual) as val
from dual;
引发以下错误(在Oracle中)
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 263 Column: 14
为什么val在后一个例子中不可用,这背后的技术原因是什么?
答案 0 :(得分:3)
评论时间有点长。
当然,您在此查询中收到错误消息:
select (case val when 1 then 'one' when 2 then 'two' else 'something else' end) as description,
(select 1 from dual) as val
from dual;
第一个表达式中的val
来自何处?当然不是来自dual
。
通常,您不能在定义它的同一select
中引用列别名(也不能在where
或group by
中引用。)
我觉得这很不寻常,因为你在引用之后定义了val
。在我看来,这应该更加明显val
没有定义。但是,排序并不重要。无论在何处定义,您都无法引用val
。
您似乎理解了修复,即使用子查询或CTE来定义值。
答案 1 :(得分:0)
好吧,在你的第二个查询中,val
不再是列名或别名,而是一个表别名,如下面的代码行所示。那么您希望如何在CASE
表达式中使用它?
(select 1 from dual) as val