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/ y) l7 N% E7 {& t9 g. u$ F
简单的 CASE 表达式和 DECODE 函数(以及在特定情况下搜索的 CASE 表达式)是否总是回到相同的结果? \# o- c t- N0 ]5 S3 S& d
9 g" M( u' K3 y" e* n 解决方案: ! u6 {- n6 Q `7 u6 M: i7 Y
Ben 写了一篇关于 DECODE 和 CASE 差异的冗长答案。他演示了 DECODE 和 CASE 可能会在没有正确解释为什么会发生这种情况的情况下,将不同的数据类型返回到明显相同的组值。 8 r G, q1 c, k+ L. tDECODE() 非常规范:它一直是第一个结果数据类型的参数。Oracle 将隐式转换应用于所有其他结果参数。如果(如)第一个结果参数是数字,默认值是日期,则会出错。 4 S3 w- s: a* x9 y9 h! V
ORA-00932: inconsistent datatypes: expected NUMBER got DATE - l. e( k6 k/ N0 d5 s+ U; O
第一个结果参数是 NULL,Oracle 决定将其视为 VARCHAR2.如果我们将其改为数字和默认值为空的第一个结果参数, DECODE() 语句将返回 NUMBER;DUMP() 证明是真的。0 j- z4 c/ o, T; \. b- E
而 CASE 坚持所有返回值都有相同的数据类型。如果不是这样,编译错误将被抛出。它不应用于隐藏转换。 : c) {6 h% a. p/ }/ w差异归结为这一点。DECODE 语句将运行,CASE 句子不能: 5 `+ R8 e' A4 l3 x- B& o+ w( P
select decode1、1、1、1from dual;select case 1 when 1 then 1 else '1' end from dual;: D# a" B/ j8 m( g9 w