NVL2功能为COALESCE功能

时间:2017-06-20 06:45:10

标签: sql oracle

我试图通过NVL和NVL2实现COALESCE功能。它似乎与NVL一起工作正常。但是,NVL2没有给出期望的结果。我错过了NVL2的东西。

NVL

WITH test_t
   (col_1, col_2, col_3) AS
(select 'a', null, null from dual
union
select null,'b',null from dual
union 
select null, null, 'c' from dual)
select nvl(nvl(col_1,col_2),col_3) from test_t;

它给出了所需的输出。同样我想用NVL2实现它不会产生欲望的结果。

NVL2

WITH test_t
   (col_1, col_2, col_3) AS
(select 'a', null, null from dual
union
select null,'b',null from dual
union 
select null, null, 'c' from dual)
select nvl2(nvl2(col_1,col_1,col_2),col_2,col_3) from test_t;

NVL2以下面的方式运作

NVL2( string1, value_if_not_null, value_if_null )

需要了解是否可以使用NVL2进行上述要求?如果是,那怎么样?

这也是面试问题:(

3 个答案:

答案 0 :(得分:1)

尝试以下方法:

WITH test_t
   (col_1, col_2, col_3) AS
(select 'a', null, null from dual
union
select null,'b',null from dual
union 
select null, null, 'c' from dual)
select nvl2(nvl2(col_1,col_1,col_2),nvl2(col_1,col_1,col_2),col_3) from test_t;

我假设每次都适用:

nvl(val1,val2)= nvl2(val1,val1,val2)

答案 1 :(得分:1)

上述nvl2方法givven中存在逻辑错误...

正确的方法是:

WITH test_t
   (col_1, col_2, col_3) AS
(select 'a', null, null from dual
union
select null,'b',null from dual
union 
select null, null, 'c' from dual)
select nvl2(nvl2(col_1,col_1,col_2),nvl2(col_1,col_1,col_2),col_3) from test_t

<强>结果

a
b
c

答案 2 :(得分:0)

使用NVL2进行3列的合并表达式

select nvl2(col_1,col_1,nvl2(col_2, col_2, col_3)) from test_t
相关问题