2012-03-15 30 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評估板每次都有兩個參數。

希望它可以幫助...