回答

收藏

CASE 语句和 DECODE 是否等效?

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

看上去很简单CASE 表达式和 DECODE 函数是等效的,它们返回的结果应该是吗?
# P6 Z0 I$ n) @- Z" e: d2 b; H9 o对于简单的 文档CASE 表达式有以下说明:
' B% r+ n1 L/ {4 C8 s简单的 CASE 表达式返回 selector_value 匹配选择器的第一个结果。不评估剩余表达式。如果没有 selector_value 匹配选择器,则 CASE如果存在 表达式,则返回 else_result,否则返回 NULL。) J6 @3 [$ I4 l- ^" Y! H" |
将其与DECODE 对比函数,描述似乎是一样的。8 _" U* h' Y# ]" O7 M
DECODE 将 expr 比较每个搜索值。expr 等于搜索,则 Oracle 数据库返回相应的结果。如果没有找到匹配项, Oracle 返回默认值。如果省略 default,则 Oracle 返回 null。% @% g6 D* a5 r: D
因搜索 CASE 表达式可以等同于简单,也可以解释为相同。  ^( ~1 |: ^# v0 K) p. h
这三句话似乎都回到了相同的结果 0。
4 l0 R! y5 D" B- v6 P
    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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则