2013-01-17 69 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) –