在PL / SQL中使用DISTINCT的NVL

时间:2015-05-29 05:46:24

标签: oracle plsql

为什么NVL函数在pl / sql中不兼容?

例如:

select DISTINCT (NVL(b.state_id,'0')) 
From branch_detail b 
where b.state_name like ('TAMILNADU%')

这是表结构(

branch_detail
=====================

state_id   state_name
--------   ---------
  1          kerala
  1          kerala
  2          karnataka
  2          karnataka

预期输出:0

2 个答案:

答案 0 :(得分:1)

NVL()函数替换结果集中的NULL。必须有返回的行才能生效。

  

“如果没有返回任何行,我该如何处理”

您需要生成一行。这可能有点作弊,但它可以做你想做的事情:

SQL> Select distinct (nvl(b.state_id,'0')) 
  2  from ( select 'tamilnadu' as state_name from dual ) t
  3       left outer join branch_detail b 
  4      on b.state_name = t.state_name
  5  /

(NVL(B.STATE_ID,'0'))
---------------------
                    0

SQL> select distinct (nvl(b.state_id,'0')) 
  2  from ( select 'kerala' as state_name from dual ) t
  3         left outer join branch_detail b 
  4      on b.state_name = t.state_name
  5  /

(NVL(B.STATE_ID,'0'))
---------------------
                    1

SQL> 

内联视图t为搜索的值伪造一行;左外连接意味着你将获得一行,它在branch_detail表中没有匹配。

答案 1 :(得分:0)

仅当state_id的值为null时,NVL函数才会返回值0。在您的情况下,我认为上面的查询没有返回任何行。因此,结果不会显示。我认为只有在为查询返回的值为null时才会起作用。