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

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”?


有只小跳蛙
浏览 621回答 3
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  ) tmpWHERE department = 'SALES' ;或在WHERE条件下重复计算:SELECT ename     , job     , CASE deptno         WHEN 10 THEN 'ACCOUNTS'         WHEN 20 THEN 'SALES'                 ELSE 'UNKNOWN'       END AS departmentFROM empWHERE    CASE deptno      WHEN 10 THEN 'ACCOUNTS'      WHEN 20 THEN 'SALES'              ELSE 'UNKNOWN'    END = 'SALES' ;我想这是查询的简化版本,或者您可以使用:SELECT ename     , job     , 'SALES' AS departmentFROM empWHERE deptno = 20 ;

Qyouu

您的表不包含“部门”列,因此您不能在where子句中引用它。请改用deptno。SELECT ename,      job,      CASE deptno          WHEN 10          THEN 'ACCOUNTS'          WHEN 20          THEN 'SALES'          ELSE 'UNKNOWN'       END AS departmentFROM   emp /* !!! */ where deptno = 20;

冉冉说

select emp_.*from (SELECT ename  ,    job  ,    CASE deptno         WHEN 10           THEN 'ACCOUNTS'         WHEN 20           THEN 'SALES'         ELSE 'UNKNOWN'       END AS departmentFROM emp /* !!! */ ) emp_ where emp_.department='UNKNOWN';
打开App,查看更多内容
随时随地看视频慕课网APP