SQL解码空值

时间:2012-03-15 00:34:31

标签: sql oracle

我有以下查询。当type_id is null我希望将其按名称“未知”分组时 我怎么能这样做。
我知道有一个解码功能,但我不知道如何使用它。

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

我该怎么办?

3 个答案:

答案 0 :(得分:13)

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 :(得分:9)

对于null,我们有NVL功能。它可以如下使用

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

答案 2 :(得分: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每次都计算两个参数。

希望它有所帮助...