ORACLE中的CASE函数

CASE Function in ORACLE

我有几个关于ORACLE中使用的CASE函数的问题。

使用CASE函数时,所有表达式中使用的数据类型必须相同。

CASE 的语法是:

CASE expr WHEN comparison_expr1 THEN return_expr1
          WHEN comparison_expr2 THEN return_expr2
          WHEN comparison_exprn THEN return_exprn
ELSE expr 
END

expr、comparison_expr 和 return_expr 的数据类型必须相同。

有两个例子让我很困惑

1. SELECT last_name, salary, job_id,
(CASE JOB_ID WHEN 'IT_PROG' THEN 1.10 * SALARY
            WHEN 'ST_CLERK' THEN 1.15 * SALARY
            WHEN 'SA_REP' THEN 1.20 * SALARY
            ELSE  SALARY END) "REVISED SALARY"
            FROM EMPLOYEES;




2.  SELECT LAST_NAME, SALARY,
(CASE  WHEN SALARY<5000 THEN 'LOW'
       WHEN SALARY<10000 THEN 'MEDIUM'
       WHEN SALARY<20000 THEN 'GOOD'
       ELSE 'EXCELLENT' END) "QUALIFIED SALARY"
       FROM EMPLOYEES;

这两个查询可以正常执行。

在第一个示例中,您可以看到 job_id 的值已被解码。问题是: 1. 为什么expr(job_id=varchar2)和return expr(1.10 * SALARY=numeric)的数据类型不同? 2. 在第二个示例中,如果我使用 "salary" 的方式与 #1 中使用 job_id 的方式相同,则查询会导致错误。为什么?编辑后的查询如下:

        SELECT LAST_NAME, SALARY,
(CASE **SALARY** WHEN SALARY<5000 THEN 'LOW'
             WHEN SALARY<10000 THEN 'MEDIUM'
             WHEN SALARY<20000 THEN 'GOOD'
             ELSE 'EXCELLENT' END) "QUALIFIED SALARY"
             FROM EMPLOYEES;

请帮忙!

对于简单的 CASE 表达式,expr 和所有 comparison_expr 值必须具有相同的数据类型(CHAR、VARCHAR2、NCHAR 或 NVARCHAR2、NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE) 或都必须具有数字数据类型。

对于简单和搜索 CASE 表达式,所有 return_exprs 必须具有相同的数据类型(CHAR、VARCHAR2、NCHAR 或 NVARCHAR2、NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE) 或都必须具有数字数据类型。

所以 expr 和 comparison_expr 相关但与 return_expr 无关。

对于你的第二个问题,salary 是一个数字字段,而 salary<1000 是一个表达式 returns 布尔值如此不同的数据类型,因此违反了规则 1。这就是你得到错误的原因。

有关详细信息,请参阅 case expressions explanation

在第一个示例中,JOB_ID 比较表达式 相关(即 'IT_PROG''ST_CLERK''SA_REP')而 SALARY 结果表达式相关 :

--------          Comparison ---- Result
(CASE JOB_ID WHEN 'IT_PROG'  THEN 1.10 * SALARY
             WHEN 'ST_CLERK' THEN 1.15 * SALARY
             WHEN 'SA_REP'   THEN 1.20 * SALARY
                             ELSE  SALARY END) "REVISED SALARY"

比较表达式的类型相同;结果表达式的类型也相同。但是,允许比较表达式和结果表达式具有不同的类型。

第二个代码片段是不同语法的示例 - 所谓的 searched case expression。它与第一个片段不同,后者称为 简单案例表达式 。这是一种完全不同的情况,因为根本没有搜索表达式:第二种语法需要提供单独的条件,例如 SALARY<5000。有关差异,请参阅 link 中的信息。