我的编程空间,编程开发者的网络收藏夹
学习永远不晚

NVL 与 COALESCE 的重要区别

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

NVL 与 COALESCE 的重要区别

NVL 与 COALESCE 的重要区别

大家都知道的区别:

NVL Oracle 专属 只支持两个参数
COALESCE SQL 标准 支持多个参数

但是今天偶然间还发现一个重要差别:滥用 NVL 可能导致额外的计算

NVL 无论前面的参数是否为 NULL 均会计算所有参数
COALESCE 如果遇到一个不为 NULL 的参数,则不计算后面的表达式

以 PL/SQL 为例,NVL 的表现就如同一般的函数,但 COALESCE 更像是一个语句,可以成功避免进行耗时的运算;

SQL 中可能也是如此,欢迎读者自行验证并在评论区讨论!

DECLARE
  l_n VARCHAR2(4000) := "x";
  l_s VARCHAR2(4000) := "x";
  FUNCTION Expensive_Function RETURN VARCHAR2 IS
  BEGIN
    Dbms_Output.Put_Line("Expensive_Function !!!");
    RETURN "x";
  END Expensive_Function;
  FUNCTION Common_Function(p_S1 IN VARCHAR2, p_S2 IN VARCHAR2)
    RETURN VARCHAR2 IS
  BEGIN
    RETURN "x";
  END Common_Function;
  PROCEDURE Common_Procedure(p_S1 IN VARCHAR2, p_S2 IN VARCHAR2) IS
  BEGIN
    RETURN;
  END Common_Procedure;
BEGIN
  Dbms_Output.Put_Line("Function");
  l_s := Common_Function(l_n, Expensive_Function);
  Dbms_Output.Put_Line("Procedure");
  Common_Procedure(l_n, Expensive_Function);
  Dbms_Output.Put_Line("Nvl");
  l_s := Nvl(l_n, Expensive_Function); -- Nvl就像普通的函数一样,要先计算参数
  Dbms_Output.Put_Line("Coalesce");
  l_s := Coalesce(l_n, Expensive_Function); -- 非常特殊的函数,行为类似于 IF-ELSE CASE AND OR 不会进行多余的计算
  Dbms_Output.Put_Line("CASE");
  l_s := CASE l_s
           WHEN "x" THEN
            "xxx"
           WHEN Expensive_Function THEN
            "yyy"
           ELSE
            Expensive_Function
         END;
  Dbms_Output.Put_Line("AND");
  IF NOT (l_n IS NULL AND Expensive_Function IS NULL) THEN
    NULL;
  END IF;
  Dbms_Output.Put_Line("OR");
  IF l_n IS NOT NULL OR Expensive_Function IS NOT NULL THEN
    NULL;
  END IF;
END;

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

NVL 与 COALESCE 的重要区别

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

NVL 与 COALESCE 的重要区别

大家都知道的区别: NVL Oracle 专属 只支持两个参数 COALESCE SQL 标准 支持多个参数 但是今天偶然间还发现一个重要差别:滥用 NVL 可能导致额外的计算
NVL 与 COALESCE 的重要区别
2016-01-11

NVL 与 COALESCE 不为人知的区别

大家都知道的区别: NVL Oracle 专属 只支持两个参数 COALESCE SQL 标准 支持多个参数 但是今天偶然间还发现一个重要差别:滥用 NVL 可能导致额外的计算
NVL 与 COALESCE 不为人知的区别
2022-04-14

Hive中coalesce和nvl有什么区别

在Hive中,coalesce和nvl都是用来处理NULL值的函数,但它们有一些区别:coalesce函数可以接受多个参数,返回参数列表中第一个非NULL值。例如,coalesce(null, 1, 2)将返回1,因为1是第一个非NULL值
Hive中coalesce和nvl有什么区别
2024-03-04

oracle中的nvl与hive中的nvl有什么区别

oracle 和 hive 的 nvl 函数用于处理 null 值,但存在差异:null 处理:hive nvl 可处理 null replacement_value,而 oracle nvl 不行。嵌套 null 检查:hive nvl
oracle中的nvl与hive中的nvl有什么区别
2024-05-03

java重载与重写的区别

重写(Override) (推荐学习:java课程)从字面上看,重写就是 重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表
java重载与重写的区别
2017-08-04

java重载与重写的区别有哪些

本篇内容主要讲解“java重载与重写的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java重载与重写的区别有哪些”吧!区别:1、重载实现的是编译时的多态性,而重写实现的是运行时的多态
2023-07-04

golang函数重载与多态的区别?

go 语言中不支持函数重载,因为它采用鸭子类型,根据实际类型确定值类型。而多态则通过接口类型和方法调用实现,不同类别的对象可以以相同方式响应。具体来说,go 语言中通过定义接口并实现这些方法,可以使不同类型的对象拥有相似行为,从而支持多态。
golang函数重载与多态的区别?
2024-04-30

C++ 函数重载与重写有何区别?

c++++ 函数重载与重写:重载:同名函数具有不同的参数类型或数量,编译时选择合适版本。重写:派生类中与基类同名函数,覆盖基类实现,提供派生类特定实现。重载特征:参数类型或数量不同,编译时绑定。重写特征:参数类型和数量相同,运行时绑定,需要
C++ 函数重载与重写有何区别?
2024-04-13

MariaDB与MySQL的主要区别是什么

本篇内容主要讲解“MariaDB与MySQL的主要区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MariaDB与MySQL的主要区别是什么”吧!主要区别介
2023-03-10

php >要不要的区别

php >要不要的区别:1、要闭合标签的话,会引起多余的输出,php错误或者空白页等;2、不要闭合标签的话,可以防止闭合标签后的有害内容;3、如果是混合使用的话,还是要写闭合标签的。
2015-12-09

java重载和重写的区别

java重载和重写的区别:(推荐:java视频教程)1、定义区别:①重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。②覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数
java重载和重写的区别
2018-11-09

CSS中Class与ID的区别,Margin与Padding的区别

编程学习网:我们知道,Class能重复用,然而ID在页面当中只可以被用一次。可能很大部分浏览器反复用相同ID不会出现问题,但是者是不符合标准的使用,就很有可能会导致有一些浏览器的现实问题。
CSS中Class与ID的区别,Margin与Padding的区别
2024-04-23

PHP中跳转与重定向的区别有哪些

这篇文章主要讲解了“PHP中跳转与重定向的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中跳转与重定向的区别有哪些”吧!区别:1、跳转是当前URL请求成功,重新请求新的URL
2023-06-25

PHP中跳转与重定向的区别是什么

区别:1、跳转是当前URL请求成功,重新请求新的URL;而重定向是当前的URL无效,被重新定位到新的URL上。2、在跳转中,浏览器会记录当前URL和新URL到历史记录中;而重定向不会。3、重定向是不能回退到当前URL的;而跳转可以。
2015-10-03

编程热搜

目录