Oracle中nvl()与nvl2()函数详解:

  • 函数nvl(expression1,expression2)根据参数1是否为null返回参数1或参数2的值;
  • 函数nvl2(expression1,expression2,expression3)根据参数1是否为null返回参数2或参数3的值。

1.nvl:根据参数1是否为null返回参数1或参数2的值

【函数格式】nvl(expression1,expression2)

【函数说明】

  • expression1值为null,则该函数返回expression2
  • expression1值不为null,则该函数返回expression1
  • expression1expression2的值均为null,则该函数返回null

【特别说明】:参数expression1expression2可以是字符型、数字型或日期型,但参数expression1expression2的类型必须一致。

【样例展示一】expression1值为null:

  • expression2为字符型:

select nvl(null,’ABCD’) from dual;–返回:ABCD
select nvl(null,’abcd’) from dual;–返回:abcd
select nvl(null,’12345′) from dual;–返回:12345

  • expression2为数值型:

select nvl(null,12345) from dual;–返回:12345
select nvl(null,00000) from dual;–返回:0
select nvl(null,-12345) from dual;–返回:-12345
select nvl(null,123.45) from dual;–返回:123.45
select nvl(null,-123.45) from dual;–返回:-123.45

  • expression2为日期时间型:

select nvl(null,sysdate) from dual;–返回:2022/2/25 11:54:18
select nvl(null,to_date(‘2022/2/25 11:54:18′,’yyyy-mm-dd hh24:mi:ss’)) from dual;–返回:2022/2/25 11:54:18
select nvl(null,to_date(‘2022/2/25′,’yyyy-mm-dd’)) from dual;–返回:2022/2/25
select nvl(null,to_date(‘2022′,’yyyy’)) from dual;–返回:2022/2/1

【样例展示二】expression1值不为null:

  • expression1为字符型:

select nvl(‘ABCD’,’abcd’) from dual;–返回:ABCD
select nvl(‘abcd’,’ABCD’) from dual;–返回:abcd
select nvl(‘12345′,’54321’) from dual;–返回:12345

  • expression1为数值型:

select nvl(12345,null) from dual;–返回:12345
select nvl(00000,11111) from dual;–返回:0
select nvl(-12345,null) from dual;–返回:-12345
select nvl(123.45,-123.45) from dual;–返回:123.45
select nvl(-123.45,123.45) from dual;–返回:-123.45

  • expression1为日期时间型:

select nvl(sysdate,null) from dual;–返回:2022/2/25 12:18:23
select nvl(to_date(‘2022/2/25 12:18:23′,’yyyy-mm-dd hh24:mi:ss’),null) from dual;–返回:2022/2/25 12:18:23
select nvl(to_date(‘2022/2/25′,’yyyy-mm-dd’),null) from dual;–返回:2022/2/25
select nvl(to_date(‘2022′,’yyyy’),null) from dual;–返回:2022/2/1

【样例展示三】expression1、expression2值均为null:

select nvl(null,null) from dual;–返回空值
select nvl(”,null) from dual;–返回空值
select nvl(null,”) from dual;–返回空值
select nvl(”,”) from dual;–返回空值

2.nvl2:根据参数1是否为null返回参数2或参数3的值

【函数格式】nvl2(expression1,expression2,expression3)

【函数说明】

  • expression1不为null,则该函数返回expression2值;
  • expression1为null,则该函数返回expression3值;
  • expression1、expression2、expression3值均为null,则该函数返回null。

【特别说明】

  • expression1的类型不需要与expression2expression3的类型保持一致;
  • expression2expression3的类型尽量保持一致,若不一致,当expression1为null时,则expression3会自动转换为expression2的类型,若两个数据类型之间无法转换,则会报错。

【样例展示一】expression1不为null:

  • expression2expression3均为字符型:

select nvl2(0,’ABCD’,’abcd’) from dual;–返回:ABCD
select nvl2(‘a’,’ABCD’,’1234′) from dual;–返回:ABCD
select nvl2(sysdate,’1234′,’abcd’) from dual;–返回:1234

  • expression2expression3均为数值型:

select nvl2(0,12345,54321) from dual;–返回:12345
select nvl2(‘a’,123.45,543.21) from dual;–返回:123.45
select nvl2(sysdate,-12345,-54321) from dual;–返回:-12345

  • expression2expression3数据类型不一致:

注意:此时expression1有值,因此该函数直接返回expression2的值,即使expression3的类型无法转换为expression2的类型也不会报错。

select nvl2(0,’ABCD’,54321) from dual;–返回:ABCD
select nvl2(‘a’,’abcd’,543.21) from dual;–返回:abcd
select nvl2(sysdate,’12345′,-54321) from dual;–返回:12345

【样例展示二】expression1为null:

  • expression2expression3均为字符型:

select nvl2(null,’ABCD’,’abcd’) from dual;–返回:abcd
select nvl2(”,’ABCD’,’1234′) from dual;–返回:1234

  • expression2expression3均为数值型:

select nvl2(null,12345,54321) from dual;–返回:54321
select nvl2(”,123.45,543.21) from dual;–返回:543.21

  • expression2expression3数据类型不一致:

注意:此时expression1值为null,因此该函数会返回expression3的值,若expression3的类型无法转换为expression2的类型,则会报错。

select nvl2(null,’ABCD’,54321) from dual;–返回:54321
select nvl2(”,’abcd’,543.21) from dual;–返回:543.21
select nvl2(”,543.21,’abcd’) from dual;–执行报错
select nvl2(null,’abcd’,sysdate) from dual;–返回:25-2月 -22
select nvl2(null,sysdate,’abcd’) from dual;–执行报错

【样例展示三】expression1为null,且expression2expression3值为null:

select nvl2(null,null,’123′) from dual;–返回:123
select nvl2(null,’abc’,null) from dual;–返回:空值
select nvl2(null,null,null) from dual;–返回:空值
select nvl2(”,”,”) from dual;–返回:空值