看上去很简单CASE 表达式和 DECODE 函数是等效的,它们返回的结果应该是吗? . @( }/ J9 z- W0 U6 _- ~5 J6 q/ v对于简单的 文档CASE 表达式有以下说明: 5 p' p# V5 k8 C# [* F& R简单的 CASE 表达式返回 selector_value 匹配选择器的第一个结果。不评估剩余表达式。如果没有 selector_value 匹配选择器,则 CASE如果存在 表达式,则返回 else_result,否则返回 NULL。2 M* D( F o9 W |1 g4 H 将其与DECODE 对比函数,描述似乎是一样的。# |2 G0 n7 v$ K7 ^; ^: W1 V: N DECODE 将 expr 比较每个搜索值。expr 等于搜索,则 Oracle 数据库返回相应的结果。如果没有找到匹配项, Oracle 返回默认值。如果省略 default,则 Oracle 返回 null。 3 g1 K0 r- P$ M" ~; i" q6 ]! X因搜索 CASE 表达式可以等同于简单,也可以解释为相同。 5 F3 q5 M; `0 }" l9 c这三句话似乎都回到了相同的结果 0。 6 i: m. q" `, B( |" J, q5 f' K \
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/ h2 D6 k; H' L9 A0 y
简单的 CASE 表达式和 DECODE 函数(以及在特定情况下搜索的 CASE 表达式)是否总是回到相同的结果?! h& j5 t& @7 n5 e" n$ u
9 P6 L/ P1 [2 K1 E2 Y# L! [; X解决方案: # a, o8 t! O& h+ F) t2 p
Ben 写了一篇关于 DECODE 和 CASE 差异的冗长答案。他演示了 DECODE 和 CASE 可能会在没有正确解释为什么会发生这种情况的情况下,将不同的数据类型返回到明显相同的组值。 6 k9 E* f: h9 k9 d* `1 I, CDECODE() 非常规范:它一直是第一个结果数据类型的参数。Oracle 将隐式转换应用于所有其他结果参数。如果(如)第一个结果参数是数字,默认值是日期,则会出错。 2 x2 M' \' |, K' O2 w8 `: S; n( Q. r" D
ORA-00932: inconsistent datatypes: expected NUMBER got DATE8 k1 o. u! a, c: ?- O
第一个结果参数是 NULL,Oracle 决定将其视为 VARCHAR2.如果我们将其改为数字和默认值为空的第一个结果参数, DECODE() 语句将返回 NUMBER;DUMP() 证明是真的。* K2 G" p+ c3 L6 b# `; a3 U
而 CASE 坚持所有返回值都有相同的数据类型。如果不是这样,编译错误将被抛出。它不应用于隐藏转换。 / n: A7 y/ f1 n1 P# G, y差异归结为这一点。DECODE 语句将运行,CASE 句子不能:, u3 c E o# c3 y h
select decode1、1、1、1from dual;select case 1 when 1 then 1 else '1' end from dual;9 ]$ f7 S! x3 {( e$ U5 B: F J