在阅读解码函数和CASE WHEN
语句之间的差异时,我感到困惑,因为我理解如果两者对下面这样的简单方程都给出相同的结果:
DECODE(col1, 'ABC', 'DEF', 'OTHERS' ) AS COL2
CASE WHEN COL1 = 'ABC' THEN 'DEF'
ELSE 'OTHERS'
END AS COL2
那么函数的功能和语句的功能有什么区别呢?
附言:我知道凯斯能够得到更复杂的方程。。。我在这里的问题更多的是关于理解函数和语句之间的区别。
在SQL中,没有"CASE语句"这样的东西。您的示例是CASE
表达式。(PL/SQL中确实存在CASE
语句。(
文档中指出:"表达式是一个或多个值、运算符和计算为值的SQL函数的组合。"因此,SQL函数与表达式没有什么不同,它是一种特定类型的表达式。
请注意,DECODE
和CASE
在比较NULL值时表现不同:DECODE
认为两个NULL"相同",这是将NULL与任何值进行比较都会产生"未知"结果的规则的例外。
with data(a, b) as (
select 1,1 from dual union all
select 1,null from dual union all
select null,1 from dual union all
select null, null from dual
)
select a, b,
decode(a,b,'same','different') decode_result,
case when a = b then 'same' else 'different' end case_result
from data;
A B DECODE_RESULT CASE_RESULT
------ ------ ------------- -----------
1 1 same same
1 (null) different different
(null) 1 different different
(null) (null) same different
我非常确信CASE
在9i之前的Oracle数据库版本中不存在,所以您必须使用DECODE
。
没有区别,它们都将做相同的工作,但CASE
更易于维护。当必须做复杂的事情时,DECODE
可以发展成一个真正的怪物,带有嵌套的DECODE
,所以你可能知道在键入该语句时你在做什么,但一个月后你陷入了深深的麻烦,因为你不知道什么属于什么,哪个右括号正在关闭哪个左括号。。。真正的噩梦。
但是,对于简单的事情,它是相当好的。节省一些打字。
函数只是一些被封装的功能。使用函数,您可以在任何地方调用函数,而无需明确拼写。有预定义的函数,如DECODE()
,也可以自己定义函数。
语句类似于select 1 from dual
,可能包含函数(select decode(col1,'1','yes','no') from mytable
(。
该语句是(只要你不在一个块中,块本身可能包含多条语句(你发送给DB的命令,函数有点像是一条如何处理给定参数的指令。