2012-03-15 47 views
6

我有以下查询。当type_id is null我希望它被分组的名称“未知”。
我该怎么做。
我知道有一个解码功能,但我不知道如何使用它。SQL解码空值

select type_id, 
     name 
    from test_table 
group by decode(type_id,'Unknown'), 
      name; 

我该怎么办?

+0

IFNULL(),COALESC() – wildplasser 2012-03-15 00:39:56

+0

DECODE是解码(列,potentialvalue,结果,2ndpotentialvalue,结果...... NpotentialValue,结果,elsevalue)case语句有点容易阅读等都是有些人喜欢的。仅供参考 - 用于快速定义功能的重要资源是TechOnTheNet。 http://www.techonthenet.com/oracle/functions/decode.php你可以很容易地谷歌“Oracle解码”,它需要你正确的上面的链接页面。保存发布并等待答案。 – user158017 2012-03-15 01:50:49

回答

11
select decode(type_id, null, 'Unknown', type_id), name, count(*) 
from 
(
    select 'asdf' type_id, 'name1' name from dual union all 
    select 'asdf' type_id, 'name2' name from dual union all 
    select null type_id, 'name3' name from dual 
) test_table 
group by type_id,name; 

我@sql_mommy是CASE可能会更好看同意使用。但我不同意使用TechOnTheNet作为您的主要信息来源。官方文档通常会更好,page for DECODE就是一个很好的例子。

DECODE有一些奇怪的行为:“在DECODE函数中,Oracle认为两个空值是等价的。”这一行为在TechOnTheNet文章中没有提及。

+1

+1,用于在TechOnTheNet上推广Oracle文档。 TOTN可以使某些功能更容易理解,但他们有时可以忽略重要信息。 – Ollie 2012-03-15 08:21:53

+0

非常感谢您的信息 – Arav 2012-03-16 01:31:33

9

对于null,我们有NVL函数。它可以如下

select nvl(type_id,'Unknown'),name from test_table group by 
type_id,name; 
3

您可以使用该NVL功能或COALESCE

select NVL(type_id, 'Unknown') AS type_id, 
     name 
    from test_table 
group by NVL(type_id, 'Unknown'), 
      name; 

或者

select COALESCE(type_id, 'Unknown') AS type_id, 
     name 
    from test_table 
group by COALESCE(type_id, 'Unknown'), 
      name; 

COALESCENVL更有效,因为它仅评估第二个参数,如果第一个是NULL而NVL评估板每次都有两个参数。

希望它可以帮助...