ORACLE中的CASE函数

时间:2015-07-04 12:45:58

标签: sql oracle10g case

我对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.在第二个例子中,如果我使用&#34; salary&#34;在#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;

请帮忙!

2 个答案:

答案 0 :(得分:1)

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

相关
SALARY

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

第二个代码段是不同语法的示例 - 所谓的searched case expression。它与第一个片段不同,后者称为简单案例表达式。这是完全不同的情况,因为根本没有搜索表达式:第二种语法要求提供单独的条件,例如-------- 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" 。请参阅链接中的信息以了解差异。

答案 1 :(得分:0)

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

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

所以expr和comparison_expr是相关的,但不是return_expr。

对于第二个问题,salary是一个数字字段,而salary<1000是一个返回布尔值的表达式,因此不同的数据类型,因此规则1被破坏。这就是你收到错误的原因。

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