当我们使用某个表达式作为输出的一列时,我们无法再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