oracle sql 中的 'statement' 和 'function' 到底有什么区别?
What is exactly difference between a 'statement' and a 'function' in oracle sql?
在阅读 decode 函数和 CASE WHEN
语句之间的区别时,我感到困惑,同时理解如果两者对于如下简单方程给出相同的结果:
DECODE(col1, 'ABC', 'DEF', 'OTHERS' ) AS COL2
CASE WHEN COL1 = 'ABC' THEN 'DEF'
ELSE 'OTHERS'
END AS COL2
那么函数和语句的功能有什么区别呢?
p.s。我知道 Case 能够计算更复杂的方程式...我的问题更多是关于理解函数和语句之间的差异。
我非常确定 CASE
在 9i 之前的 Oracle 数据库版本中不存在,因此您不得不 使用 DECODE
。
没什么区别,它们都做同样的工作,但 CASE
更易于维护。当必须完成复杂的事情时,DECODE
可以成长为一个真正的 怪物 ,使用嵌套的 DECODE
,因此您可能在输入该语句时知道自己在做什么, 但一个月后你陷入了深深的麻烦,因为你不知道什么属于什么,哪个右括号正在关闭哪个左括号,......真正的噩梦。
但是,对于简单的事情,还是可以的。节省一些输入。
在SQL中,没有"CASE statement"这样的东西。您的示例是 CASE
表达式 。 (CASE
语句确实存在于 PL/SQL 中。)
文档指出 "An expression is a combination of one or more values, operators, and SQL functions that evaluates to a value." 所以 SQL 函数与表达式没有区别,它是一种特定类型的表达式。
请注意,DECODE
和 CASE
在比较 NULL 值时表现不同:DECODE
将两个 NULL 视为 "the same",这是比较规则的一个例外任何东西的 NULL 都有一个 "unknown" 结果。
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
函数只是封装了一些功能。使用函数,您可以从任何地方调用一个功能,而无需明确地拼写出来。有预定义函数,例如 DECODE()
或者您可以 define functions yourself.
语句类似于 select 1 from dual
,可能包含函数 (select decode(col1,'1','yes','no') from mytable
)。
语句是(只要你不在 block 中,它本身可能包含多个语句)你发送给数据库的命令,函数是一种指令,说明如何处理给定参数。
在阅读 decode 函数和 CASE WHEN
语句之间的区别时,我感到困惑,同时理解如果两者对于如下简单方程给出相同的结果:
DECODE(col1, 'ABC', 'DEF', 'OTHERS' ) AS COL2
CASE WHEN COL1 = 'ABC' THEN 'DEF'
ELSE 'OTHERS'
END AS COL2
那么函数和语句的功能有什么区别呢?
p.s。我知道 Case 能够计算更复杂的方程式...我的问题更多是关于理解函数和语句之间的差异。
我非常确定 CASE
在 9i 之前的 Oracle 数据库版本中不存在,因此您不得不 使用 DECODE
。
没什么区别,它们都做同样的工作,但 CASE
更易于维护。当必须完成复杂的事情时,DECODE
可以成长为一个真正的 怪物 ,使用嵌套的 DECODE
,因此您可能在输入该语句时知道自己在做什么, 但一个月后你陷入了深深的麻烦,因为你不知道什么属于什么,哪个右括号正在关闭哪个左括号,......真正的噩梦。
但是,对于简单的事情,还是可以的。节省一些输入。
在SQL中,没有"CASE statement"这样的东西。您的示例是 CASE
表达式 。 (CASE
语句确实存在于 PL/SQL 中。)
文档指出 "An expression is a combination of one or more values, operators, and SQL functions that evaluates to a value." 所以 SQL 函数与表达式没有区别,它是一种特定类型的表达式。
请注意,DECODE
和 CASE
在比较 NULL 值时表现不同:DECODE
将两个 NULL 视为 "the same",这是比较规则的一个例外任何东西的 NULL 都有一个 "unknown" 结果。
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
函数只是封装了一些功能。使用函数,您可以从任何地方调用一个功能,而无需明确地拼写出来。有预定义函数,例如 DECODE()
或者您可以 define functions yourself.
语句类似于 select 1 from dual
,可能包含函数 (select decode(col1,'1','yes','no') from mytable
)。
语句是(只要你不在 block 中,它本身可能包含多个语句)你发送给数据库的命令,函数是一种指令,说明如何处理给定参数。