我对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;
请帮忙!
答案 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。