SQL,子查询中列的范围

时间:2017-06-21 11:44:36

标签: sql oracle

我试图理解,在不同的地方使用子查询时,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在后一个例子中不可用,这背后的技术原因是什么?

2 个答案:

答案 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中引用列别名(也不能在wheregroup by中引用。)

我觉得这很不寻常,因为你在引用之后定义了val 。在我看来,这应该更加明显val没有定义。但是,排序并不重要。无论在何处定义,您都无法引用val

您似乎理解了修复,即使用子查询或CTE来定义值。

答案 1 :(得分:0)

好吧,在你的第二个查询中,val不再是列名或别名,而是一个表别名,如下面的代码行所示。那么您希望如何在CASE表达式中使用它?

(select 1 from dual) as val