oracle sql中的'statement'和'function'到底有什么区别?



在阅读解码函数和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函数与表达式没有什么不同,它是一种特定类型的表达式。

请注意,DECODECASE在比较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的命令,函数有点像是一条如何处理给定参数的指令。

最新更新