为了账号安全,请及时绑定邮箱和手机立即绑定

在where子句中使用“ case expression column”

/ 猿问

在where子句中使用“ case expression column”

慕莱坞5435954 2019-12-03 16:20:04

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:无效的标识符”


有没有一种方法可以克服Oracle 10.2 SQL中的此限制?如何在where子句中使用“ case expression column”?


查看完整描述

3 回答

?
Cats萌萌

发生此错误的原因是,按照以下顺序对SQL SELECT语句进行了逻辑 *处理:


FROM:选择一个表或多个已联接的表以及符合ON条件的所有行组合。


WHERE:评估条件,并删除不匹配的行。


GROUP BY:将行分组(每组合为一行)


HAVING:评估条件,并删除不匹配的行。


SELECT:评估列列表。


DISTINCT:删除重复的行(如果它是SELECT DISTINCT语句)


UNION,EXCEPT,INTERSECT:那个操作的动作是在子SELECT语句的行拍摄。例如,如果它是UNION,则在评估所有子SELECT语句之后,将收集所有行(除非是UNION ALL,否则将删除所有重复行)。因此,对于EXCEPT或INTERSECT情况。


ORDER BY:行是有序的。


因此,您不能使用in WHERE子句(尚未填充或计算的东西)。另请参见以下问题:oracle-sql-clause-evaluation-order


* 逻辑处理: 请注意,数据库引擎还可以为查询选择其他评估顺序(这就是它们通常要做的!)。唯一的限制是结果应与使用上述顺序相同。


解决方案是将查询括在另一个查询中:


SELECT *

FROM

  ( SELECT ename

         , job

         , CASE deptno

             WHEN 10 THEN 'ACCOUNTS'

             WHEN 20 THEN 'SALES'

                     ELSE 'UNKNOWN'

           END AS department

    FROM emp

  ) tmp

WHERE department = 'SALES' ;

或在WHERE条件下重复计算:


SELECT ename

     , job

     , 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

     , job

     , 'SALES' AS department

FROM emp

WHERE deptno = 20 ;


查看完整回答
反对 回复 2019-12-03
?
Qyouu

您的表不包含“部门”列,因此您不能在where子句中引用它。请改用deptno。


SELECT ename

,      job

,      CASE deptno

          WHEN 10

          THEN 'ACCOUNTS'

          WHEN 20

          THEN 'SALES'

          ELSE 'UNKNOWN'

       END AS department

FROM   emp /* !!! */ where deptno = 20;


查看完整回答
反对 回复 2019-12-03
?
冉冉说

select emp_.*

from (SELECT ename

  ,    job

  ,    CASE deptno

         WHEN 10

           THEN 'ACCOUNTS'

         WHEN 20

           THEN 'SALES'

         ELSE 'UNKNOWN'

       END AS department

FROM emp /* !!! */ ) emp_ where emp_.department='UNKNOWN';


查看完整回答
反对 回复 2019-12-03

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信