【问题标题】:What is exactly difference between a 'statement' and a 'function' in oracle sql?oracle sql中的“语句”和“函数”之间到底有什么区别?
【发布时间】:2020-04-16 05:26:24
【问题描述】:

在阅读 decode 函数和 CASE WHEN 语句之间的区别时,我感到困惑,同时理解如果两者对于如下简单等式给出相同的结果:

DECODE(col1, 'ABC', 'DEF', 'OTHERS' ) AS COL2

CASE WHEN COL1 = 'ABC' THEN 'DEF'
        ELSE 'OTHERS'   
     END AS COL2

那么函数和语句的功能有什么区别呢?

附言我知道 Case 能够处理更复杂的方程式……我的问题更多是关于理解函数和语句之间的差异。

【问题讨论】:

  • CASE 是一个表达式,而不是一个语句
  • 谢谢。许多网站,包括堆栈溢出(stackoverflow.com/questions/3193692/case-vs-decode)都有用户建议 case 是一个声明,所以我很困惑。

标签: oracle case decode


【解决方案1】:

在 SQL 中,没有“CASE 语句”之类的东西。您的示例是CASE 表达式。 (CASE 语句确实存在于 PL/SQL 中。)

文档指出“表达式是一个或多个值、运算符和计算结果为一个值的 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

【讨论】:

  • 其实很多网站,包括堆栈溢出(stackoverflow.com/questions/3193692/case-vs-decode)都有用户建议case是一个语句,所以我很困惑。你的解释清楚了,谢谢。
  • 感谢您的解释 :-) 您是否知道 CASE 和 DECODE 之间的实现、数据库引擎中的差异会对性能产生影响?
  • Marcin,我能想到的唯一区别是对不同条件的评估。假设一个 CASE 包含几个使用大量资源的 WHEN 条件:如果无论如何都评估所有条件,那么性能比在第一次命中时停止评估更差。我相信 CASE 和 DECODE 都会尽快停止,所以我预计不会有任何明显的性能差异。
【解决方案2】:

我很确定 CASE 在 9i 之前的 Oracle 数据库版本中不存在,因此您必须使用 DECODE

没有区别,它们都会做同样的工作,但CASE 更易于维护。当需要完成复杂的事情时,DECODE 可以成长为真正的怪物,使用嵌套的 DECODEs,因此您可能在输入该语句时知道自己在做什么,但一个月后您就知道了由于您不知道什么属于什么,哪个右括号正在关闭哪个左括号,因此陷入了深深的麻烦,...真正的噩梦。

但是,对于简单的事情,它是完全可以的。节省一些输入。

【讨论】:

    【解决方案3】:

    函数只是封装的一些功能。使用函数,您可以从任何地方调用功能,而无需明确说明。有像DECODE()这样的预定义函数,或者你可以define functions yourself

    语句类似于select 1 from dual,可能包含函数(select decode(col1,'1','yes','no') from mytable)。

    该语句是(只要您不在block 中,它本身可能包含多个语句)是您发送到数据库的命令,函数是一种指示如何处理给定参数的指令。

    【讨论】:

      猜你喜欢
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多