Oracle 第一个字段为空,取第二个字段,如果第二个字段为空取第三个字段...... (nvl函数详解及嵌套或者coalesce函数的使用)

Nvl函数详解

写法如下:Nvl(name1,name2)nvl函数有两个参数,如果第一个参数返回不为null,则返回第一个参数的值,如果第一个参数返回的值null,则nvl函数返回第二个参数的值,如果两个都是null,则返回null

 select nvl('1','') from dual   === 1

select nvl('1','2') from dual   === 1

说明:以上两种情况是第一个参数不为空,返回第一个参数的值

select nvl('','2') from dual   === 2

说明:第一个参数为空,返回第二个参数的值

select nvl('','') from dual   === null

说明:都为空则返回null

 如果能理解以上的方法理解了,那么coalesce函数就是nvl函数的嵌套使用

写法如下:coalesce(name1,name2,name3,name4........)

第一个字段为空,取第二个字段,如果第二个字段为空取第三个字段......

基本写法就是nvl函数的嵌套,我们根据nul的特性如果两个参数返回的值都null,则返回null,只要遇到不为空的就返回对应的结果。写法如下:

第一种写法:nvl(nvl(Nvl(name1,name2),name3),name4)

第二种写法:coalesce(name1,name2,name3,name4)

说明:这样嵌套直到遇到不为空的数据返回对应的值

 

下面是具体的案例,以第一种为例:

select t.*, nvl(nvl(nvl(bond_code, cash_code), repo_code), fund_code)

  from (select bs.i_code,

               bs.rt_l_avaamount,

               bs.m_type,

               bs.a_type,

               b.i_code          bond_code,

               c.i_code          cash_code,

               i.i_code          repo_code,

               f.i_code          fund_code

          from xir_trd.ttrd_acc_balance_secu bs

          left join xir_md.tbnd b

            on b.i_code = bs.i_code

          left join xir_trd.ttrd_cashlb c

            on c.i_code = bs.i_code

          left join xir_trd.ttrd_otc_iblb i

            on i.i_code = bs.i_code

           and bs.rt_l_avaamount >= 0

          left join xir_md.tfnd f

            on f.i_code = bs.i_code

         where bs.accid = 'xecs_nbzq') t

 where (bond_code is not null or cash_code is not null or

       repo_code is not null or fund_code is not null)

以下是查询结果:

 

 

posted @ 2020-07-15 12:55  struggle_新  阅读(8541)  评论(0编辑  收藏  举报