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 函数与表达式没有区别,它是一种特定类型的表达式。

请注意,DECODECASE 在比较 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 中,它本身可能包含多个语句)你发送给数据库的命令,函数是一种指令,说明如何处理给定参数。