2013-01-17 94 views
0

的Oracle 11g:考慮以下兩個CASE語句爲什麼CASE評估ELSE子句?

CASE搜索

with null_table as (select null as null_set from dual) 
select 
    case 
    when (null_set is null) then 'NULL INDEED' 
    else 'NOTNULL?' 
    end as AM_I_NULL_OR_NOT 
from null_table 

簡單的例子

with null_table as (select null as null_set from dual) 
select 
    case null_set 
    when (null) then 'NULL INDEED' 
    else 'NOTNULL?' 
    end as AM_I_NULL_OR_NOT 
from null_table 

CASE搜索評估null_set如預期,但是,簡單CASE似乎沒有這樣做。

問題: 如何對null_set執行簡單CASE評估?

爲什麼Simple CASE會評估它?

+3

什麼都不等於null(甚至是null本身)。第二個版本的第一個時候永遠不會觸發。 – Mat

回答

3

在Oracle中,無法將null與使用=運算符進行比較。

例如:

select * from dual where null = null; -- No result 
select * from dual where 1 = 1; -- gives a result 

所以你可以做的是使用NVL另一個值來代替空:

with null_table as (select null as null_set from dual) 
select 
    case nvl(null_set,'X') 
    when 'X' then 'NULL INDEED' 
    else 'NOTNULL?' 
    end as AM_I_NULL_OR_NOT 
from null_table 

(請確保您的域可以永遠不等於價值,X在這個例子中)。

+0

奇怪的是,您可以使用舊的Oracle解碼函數,並且它會匹配null,例如解碼(null,null,'IT IS NULL','IT不是NULL')將返回'IT IS NULL'。 –

+2

@ LordPeter,也許這就是爲什麼'decode'被認爲是 - 很多次 - 作爲* null相關的函數,比如'nvl'和'nvl2'(http://www.oracle-base.com/articles/misc/) null相關-的functions.php) –