SELECT ename,job,CASE deptno WHEN 10 THEN 'ACCOUNTS' WHEN 20 THEN 'SALES' ELSE 'UNKNOWN' END AS department FROM emp /* !!! */ WHERE department = 'SALES'
这失败了:
ORA-00904: “%s: invalid identifier”
有没有办法克服Oracle 10.2 sql中的这个限制?
如何在where子句中使用’case expression column’?
解决方法
这个错误的原因是sql SELECT语句按照以下顺序进行逻辑处理:
> FROM:选择一个表或多个JOINed表,以及与ON条件匹配的所有行组合.
> WHERE:评估条件,并删除不匹配的行.
> GROUP BY:行被分组(每个组都会折叠到一行)
> HAVING:评估条件,并删除不匹配的行.
> SELECT:列的列被评估.
> DISTINCT:重复的行被删除(如果它是一个SELECT DISTINCT语句)
> UNION,EXCEPT,INTERSECT:该操作数的操作取决于子SELECT语句行.例如,如果它是一个UNION,则在对所有子SELECT语句进行求值之后,所有行都将被收集(并且重复删除,除非它是UNION ALL).因此,对于EXCEPT或INTERSECT案例.
>订单:订购行.
因此,您不能在WHERE子句中使用,尚未填充或计算.另见这个问题:oracle-sql-clause-evaluation-order
*逻辑处理:请注意,数据库引擎还可以为查询选择另一个评估顺序(这是他们通常做的!)唯一的限制是结果应该与使用上述顺序相同.
SELECT * FROM ( SELECT ename,CASE deptno WHEN 10 THEN 'ACCOUNTS' WHEN 20 THEN 'SALES' ELSE 'UNKNOWN' END AS department FROM emp ) tmp WHERE department = 'SALES' ;
或在WHERE条件下复制计算:
SELECT ename,CASE deptno WHEN 10 THEN 'ACCOUNTS' WHEN 20 THEN 'SALES' ELSE 'UNKNOWN' END AS department FROM emp WHERE CASE deptno WHEN 10 THEN 'ACCOUNTS' WHEN 20 THEN 'SALES' ELSE 'UNKNOWN' END = 'SALES' ;
我想这是您的查询的简化版本,或者您可以使用:
SELECT ename,'SALES' AS department FROM emp WHERE deptno = 20 ;