首页 > 数据库 > mysql教程 > 如何在 Oracle 10.2 查询的 WHERE 子句中使用 CASE 表达式列?

如何在 Oracle 10.2 查询的 WHERE 子句中使用 CASE 表达式列?

Linda Hamilton
发布: 2025-01-04 22:46:42
原创
759 人浏览过

How Can I Use a CASE Expression Column in the WHERE Clause of an Oracle 10.2 Query?

在 Oracle 10.2 中的 WHERE 子句中使用“Case 表达式列”

在 Oracle 10.2 中,尝试执行以下操作时会发生 ORA-00904 错误在 WHERE 子句中使用 case 表达式列。这是由于 SQL 语句的逻辑处理顺序造成的,其中在选择列之前先评估 WHERE 条件。

错误说明:

SQL 语句在逻辑处理中以下顺序:

  • FROM:表选择和行组合
  • WHERE:根据条件进行行过滤
  • GROUP BY:行分组
  • HAVING:附加行过滤
  • SELECT:列选择
  • DISTINCT:重复行删除
  • UNION/EXCEPT/INTERSECT:子查询操作
  • ORDER BY:行排序

在提供的查询中,WHERE 子句尝试使用计算出的部门列在 CASE 表达式中。但是,直到 WHERE 子句执行之后才填充此列,从而导致错误。

解决方案 1:子查询封装

要克服此限制,请附上原始查询在子查询中查询并从中选择所需的列:

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' ;
登录后复制

解决方案2:条件复制

复制WHERE条件中的CASE表达式:

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 ;
登录后复制

以上是如何在 Oracle 10.2 查询的 WHERE 子句中使用 CASE 表达式列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板