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 中的信息。
我有几个关于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 中的信息。