回答

收藏

CASE 语句和 DECODE 是否等效?

技术问答 技术问答 306 人阅读 | 0 人回复 | 2023-09-11

看上去很简单CASE 表达式和 DECODE 函数是等效的,它们返回的结果应该是吗?
" q# ?2 ?: @! b对于简单的 文档CASE 表达式有以下说明:
0 z3 A) z* F$ |# h% l8 b: B# r: K简单的 CASE 表达式返回 selector_value 匹配选择器的第一个结果。不评估剩余表达式。如果没有 selector_value 匹配选择器,则 CASE如果存在 表达式,则返回 else_result,否则返回 NULL。4 ?3 X+ S- [7 x" O8 W
将其与DECODE 对比函数,描述似乎是一样的。/ N. a8 x: J* X+ u( P! j7 X
DECODE 将 expr 比较每个搜索值。expr 等于搜索,则 Oracle 数据库返回相应的结果。如果没有找到匹配项, Oracle 返回默认值。如果省略 default,则 Oracle 返回 null。$ M$ I# v9 P( h2 X7 @
因搜索 CASE 表达式可以等同于简单,也可以解释为相同。
1 t- H* h8 q/ _. }! \; ?这三句话似乎都回到了相同的结果 0。
2 c) n  e2 q& Q' U: u
    select case 1 when 2 then null else 0 end as simple_case  case when 1 = 2 then null else 0 end as searched_case  decode(1,2,null,0) as decode  from dual$ Q+ Y: z2 c3 C3 Q4 o
简单的 CASE 表达式和 DECODE 函数(以及在特定情况下搜索的 CASE 表达式)是否总是回到相同的结果?! j1 i# s" T4 q8 v
                                                               
; y' u$ q# v; l    解决方案:                                                               
4 A, t2 u9 ?. W; K                                                                Ben 写了一篇关于 DECODE 和 CASE 差异的冗长答案。他演示了 DECODE 和 CASE 可能会在没有正确解释为什么会发生这种情况的情况下,将不同的数据类型返回到明显相同的组值。  Y5 w0 m, p+ b9 n4 ]
DECODE() 非常规范:它一直是第一个结果数据类型的参数。Oracle 将隐式转换应用于所有其他结果参数。如果(如)第一个结果参数是数字,默认值是日期,则会出错。
6 S' r- e0 q9 k5 T, `' Q5 C
    ORA-00932: inconsistent datatypes: expected NUMBER got DATE' c( O, E; {: L$ P$ n2 V0 W
第一个结果参数是 NULL,Oracle 决定将其视为 VARCHAR2.如果我们将其改为数字和默认值为空的第一个结果参数, DECODE() 语句将返回 NUMBER;DUMP() 证明是真的。
2 N* u/ ~& k8 i  _) k7 e而 CASE 坚持所有返回值都有相同的数据类型。如果不是这样,编译错误将被抛出。它不应用于隐藏转换。
( F2 b1 N: A7 o* P8 H6 k差异归结为这一点。DECODE 语句将运行,CASE 句子不能:
% C+ ?( Z% j* Y8 C
    select decode1、1、1、1from dual;select case 1 when 1 then 1 else '1' end from dual;
    $ g/ b% N, M% P6 A: L
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则