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 dual7 z5 B) j4 F. {% G I. k
简单的 CASE 表达式和 DECODE 函数(以及在特定情况下搜索的 CASE 表达式)是否总是回到相同的结果?$ o5 Z2 T# ^$ z
O) e- d8 r9 l3 v0 C解决方案: ; U- } k) _' C/ l# K. o Ben 写了一篇关于 DECODE 和 CASE 差异的冗长答案。他演示了 DECODE 和 CASE 可能会在没有正确解释为什么会发生这种情况的情况下,将不同的数据类型返回到明显相同的组值。 ( j" p) Z4 k+ o- W$ t0 xDECODE() 非常规范:它一直是第一个结果数据类型的参数。Oracle 将隐式转换应用于所有其他结果参数。如果(如)第一个结果参数是数字,默认值是日期,则会出错。( f- e, G. D) i. x' z6 C# N
ORA-00932: inconsistent datatypes: expected NUMBER got DATE( T: s- Z2 x& w; p) L5 i
第一个结果参数是 NULL,Oracle 决定将其视为 VARCHAR2.如果我们将其改为数字和默认值为空的第一个结果参数, DECODE() 语句将返回 NUMBER;DUMP() 证明是真的。 9 z- ?* O: ^# j1 i而 CASE 坚持所有返回值都有相同的数据类型。如果不是这样,编译错误将被抛出。它不应用于隐藏转换。 % A6 h% [& W. j3 w3 N, S4 B差异归结为这一点。DECODE 语句将运行,CASE 句子不能:( W& C, X9 R, p* J. R4 D
select decode1、1、1、1from dual;select case 1 when 1 then 1 else '1' end from dual; ; [. h: a% B: {8 \& n8 ?( P+ f" K7 S