加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 在where子句中使用’case expression column’

发布时间:2020-12-12 16:15:00 所属栏目:MsSql教程 来源:网络整理
导读:SELECT ename,job,CASE deptno WHEN 10 THEN 'ACCOUNTS' WHEN 20 THEN 'SALES' ELSE 'UNKNOWN' END AS departmentFROM emp /* !!! */ WHERE department = 'SALES' 这失败了: ORA-00904: “%s: invalid identifier” 有没有办法克服Oracle 10.2 SQL中的这个
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 ;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读