NVL 与 COALESCE 的重要区别「建议收藏」

NVL 与 COALESCE 的重要区别「建议收藏」大家都知道的区别: NVL Oracle 专属 只支持两个参数 COALESCE SQL 标准 支持多个参数 但是今天偶然间还发现一个重要差别:滥用 NVL 可能导致额外的计算 NVL 无论前面的参…

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;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7529.html

(0)
上一篇 2023-03-18
下一篇 2023-03-18

相关推荐

  • sql中like的用法_sql数据库like怎么用

    sql中like的用法_sql数据库like怎么用目录汇总:SQL 入门教程:面向萌新小白的零基础入门教程 前面介绍的所有操作符都是针对已知值进行过滤的。不管是匹配一个值还是多个值,检验大于还是小于已知值,或者检查某个范围的值,其共同点是过滤中使用的

    2023-04-19
    172
  • Laravel框架使用MongoDB遇到的问题解决[通俗易懂]

    Laravel框架使用MongoDB遇到的问题解决[通俗易懂]之前说的,我一直是将macOS作为开发平台,直接在macOS系统配置Nginx PHP及MySQL,由于项目需求,需要使用到MongoDB,这篇就是一部在macOS系统下运行Laravel框架使用M…

    2022-12-23
    139
  • 数据库的多表连接查询_数据库内外连接

    数据库的多表连接查询_数据库内外连接首先明确一下定义: 内连接:在多表查询的时候,只检索出表之间相互匹配的行(满足匹配条件的行),结果中不包括两个表之间不匹配的行。 一个不太准确但易懂的例子:比如有两个表,表1存储了 (1,2,3,4,

    2023-05-27
    144
  • [平台建设] HBase平台建设实践[亲测有效]

    [平台建设] HBase平台建设实践[亲测有效]本文主要介绍HBase平台的建设思路及设计, 并对跨集群数据迁移实践进行总结

    2023-05-03
    150
  • 8种常见SQL错误用法

    8种常见SQL错误用法常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time…

    2022-12-15
    144
  • Python中dict.fromkeys的使用方法

    Python中dict.fromkeys的使用方法codedict.fromkeys(keys[, value])/code是Python字典(dict)类中的一个静态方法,用于创建并返回一个新的字典,其中包含指定键序列(keys)中所有键的键值,默认的键值是None。

    2024-04-04
    86
  • 3. select语句执行过程-优化器

    3. select语句执行过程-优化器1.有哪些 2.开启追踪 优化器追踪默认是关闭的 2.1 开启 SHOW VARIABLES LIKE 'optimizer_trace'; set optimizer_trac…

    2023-03-25
    155
  • Python正规子群:优化程序性能的利器

    Python正规子群:优化程序性能的利器Python是一门简洁、易学且功能强大的编程语言。但是,有时候在处理大规模数据时,Python执行速度可能会变慢,从而影响开发效率。在这种情况下,对Python程序进行性能优化是非常重要的。在本文中,我们将介绍一些Python优化技巧,并展示如何优化Python程序的性能,从而提升代码执行效率。

    2023-12-16
    110

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注