回答

收藏

CASE 语句和 DECODE 是否等效?

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

看上去很简单CASE 表达式和 DECODE 函数是等效的,它们返回的结果应该是吗?1 F- i9 O$ y1 A
对于简单的 文档CASE 表达式有以下说明:& W' U- {0 ?3 ?2 [7 C" {( E: c
简单的 CASE 表达式返回 selector_value 匹配选择器的第一个结果。不评估剩余表达式。如果没有 selector_value 匹配选择器,则 CASE如果存在 表达式,则返回 else_result,否则返回 NULL。
% @' U6 d! |# T5 ~, P* A
将其与DECODE 对比函数,描述似乎是一样的。
; g9 H# _6 j( X6 h, c$ t- UDECODE 将 expr 比较每个搜索值。expr 等于搜索,则 Oracle 数据库返回相应的结果。如果没有找到匹配项, Oracle 返回默认值。如果省略 default,则 Oracle 返回 null。
* C  t# x9 y4 L& f
因搜索 CASE 表达式可以等同于简单,也可以解释为相同。' u, A0 x& X7 R# L0 L, \/ t3 D
这三句话似乎都回到了相同的结果 0。/ X' Q7 y8 ~# }$ M1 f+ L) E
    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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则