列表名在where中的使用

当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件。

先观察一个select查询:

select id,(c1 + c2)as s

from t1

where s >100

oracle报错:

ERROR at line 1:

ORA-00904: "S": invalididentifier

 

当然我们可以改成如下这样即可解决问题:

select id,(c1 + c2)as s

from t1

where(c1+ c2)> 100

但如此会比较繁琐,不过可以借助子查询来解决问题:

select t2.*

from(select id,(c1 + c2)as c from t1)t2

where c >100

  --或者

select t2.*

from(select id,c = c1+c2 from t1) t2

where c >100

 

 

 

再观察以下例子:

SQL>

select first_name||' '||last_name name

from employees

where rownum<6

order by name;

 

NAME

----------------------------------------------

David Austin

Ellen Abel

Hermann Baer

Mozhe Atkinson

Sundar Ande

此时,查询正常,没有出现异常,继续观察:

SQL>

select first_name||' '||last_name name

from employees

where rownum<6

    and namelike '%Ab%'

order by name;

 

        and name like '%Ab%'

            *

ERROR at line 4:

ORA-00904: "NAME":invalid identifier

此时,问题出现了。为什么在‘order by’子句时中使用列表名有效,而where中无效呢?

原因如下:

(1)FROM<left_table> <join_type> JOIN <right_table> ON<on_predicate>
(2)WHERE <where_predicate>
(3)GROUP BY <group_by_specification>
(4)HAVING <having_predicate>
(5)SELECT DISTINCT TOP(<top_specification>) <select_list>  
(6)ORDER BY <order_by_list>              

所以在where执行的时候,别名还不存在,而orderby的时候已经存在

 

当然,如果将where中的‘name’该为‘first_name||' '||last_name’即可以运行。但实在太繁琐了而且容易出错,所以应该使用子查询:

SQL>

SELECT *

FROM

(select first_name||' '||last_name name

 fromemployees

 whererownum<6

 order byname)

WHERE name like '%Ab%';

 

NAME

----------------------------------------------

Ellen Abel

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值