我试图通过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进行上述要求?如果是,那怎么样?
这也是面试问题:(
答案 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