coalesce、nvl、nvl2比较

本文详细介绍了SQL中的coalesce、nvl和nvl2函数,通过示例展示了它们在处理NULL值时的不同行为。coalesce函数返回第一个非NULL的操作数,如果没有非NULL值则返回NULL;而nvl和nvl2在所有操作数都被计算后再决定是否返回NULL。此外,文章还通过示例解释了在何时会执行函数调用,以及它们在实际使用中的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

coalesce(操作数1,操作数2[,...,操作数N]) 
1、返回coalesce操作数列表中第一个非null,如果多为null,则返回null
2、在coalesce表达式中必须至少有一个操作数不为null
3、nvl、nvl2先执行所有操作数再判断,coalesce先判断,只有在有必要时才执行操作数


SQL> declare
  2    a varchar2(20):='a';
  3    b varchar2(20):='b';
  4    c varchar2(20):='c';
  5    d varchar2(20);
  6    function getN return varchar2
  7      is
  8      begin
  9        dbms_output.put_line('Func:GetN');
 10        Return 'GetN';
 11      end;
 12  begin
 13    d:=coalesce(null,null);
 14    dbms_output.put_line(d);
 15  end;
 16  /
declare
  a varchar2(20):='a';
  b varchar2(20):='b';
  c varchar2(20):='c';
  d varchar2(20);
  function getN return varchar2
    is
    begin
      dbms_output.put_line('Func:GetN');
      Return 'GetN';
    end;
begin
  d:=coalesce(null,null);
  dbms_output.put_line(d);
end;
ORA-06550: 第 13 行, 第 6 列: 
PLS-00621: 在 COALESCE 表达式中必须至少有一个操作数不为 NULL
ORA-06550: 第 13 行, 第 3 列: 
PL/SQL: Statement ignored


SQL> 
SQL> declare
  2    a varchar2(20):='a';
  3    b varchar2(20):='b';
  4    c varchar2(20):='c';
  5    d varchar2(20);
  6    function getN return varchar2
  7      is
  8      begin
  9        dbms_output.put_line('Func:GetN');
 10        Return 'GetN';
 11      end;
 12  begin
 13    d:=coalesce(null,null,a,getN);
 14    dbms_output.put_line(d);
 15  end;
 16  /
a
PL/SQL procedure successfully completed


SQL> 
SQL> declare
  2    a varchar2(20):='a';
  3    b varchar2(20):='b';
  4    c varchar2(20):='c';
  5    d varchar2(20);
  6    function getN return varchar2
  7      is
  8      begin
  9        dbms_output.put_line('Func:GetN');
 10        Return 'GetN';
 11      end;
 12  begin
 13    d:=coalesce(null,null,getN);
 14    dbms_output.put_line(d);
 15  end;
 16  /
Func:GetN
GetN
PL/SQL procedure successfully completed


SQL> select coalesce(null,null) from dual ;
COALESCE(NULL,NULL)
-------------------


比较coalesce、nvl、nvl2
SQL> declare
  2    a varchar2(20):='a';
  3    b varchar2(20):='b';
  4    c varchar2(20):='c';
  5    d varchar2(20);
  6    function getN return varchar2
  7      is
  8      begin
  9        dbms_output.put_line('Func:GetN');
 10        Return 'GetN';
 11      end;
 12  begin
 13  
 14    dbms_output.put_line(nvl(a,getn));
 15  end;
 16  /
Func:GetN
a
PL/SQL procedure successfully completed


SQL> 
SQL> declare
  2    a varchar2(20):='a';
  3    b varchar2(20):='b';
  4    c varchar2(20):='c';
  5    d varchar2(20);
  6    function getN return varchar2
  7      is
  8      begin
  9        dbms_output.put_line('Func:GetN');
 10        Return 'GetN';
 11      end;
 12  begin
 13    select nvl2(a,a,getN1) into d from dual;
 14    dbms_output.put_line(d);
 15  end;
 16  /
Func:GetN1
a
PL/SQL procedure successfully completed


SQL> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值