为什么CASE要评估ELSE条款? Oracle 11g:考虑下面两个case语句

为什么CASE要评估ELSE条款? Oracle 11g:考虑下面两个case语句,oracle,null,oracle11g,case,Oracle,Null,Oracle11g,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 du

搜索的案例

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
简单案例

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
搜索的案例按预期计算null\u集,但简单案例似乎没有这样做

问题: 如何对null\u集执行简单的案例评估


为什么简单案例的计算结果是这样的?

在Oracle中,null不能与使用
=
运算符进行比较

例如:

select * from dual where null = null; -- No result
select * from dual where 1 = 1; -- gives a result
因此,您可以使用
NVL
将null替换为另一个值:

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。)

在Oracle中,null不能与使用
=
运算符进行比较

例如:

select * from dual where null = null; -- No result
select * from dual where 1 = 1; -- gives a result
因此,您可以使用
NVL
将null替换为另一个值:

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。)

任何内容都不等于null(即使是null本身)。第二个版本的第一个when不能触发。没有任何东西等于null(甚至null本身)。第二个版本的第一个when永远不会触发。奇怪的是,您可以使用旧的Oracle decode函数,它将匹配null,例如decode(null,null,'it IS null,'it IS NOT null')将返回'it IS null'。LordPeter,也许这就是为什么
decode
多次被认为是与空相关的函数,例如
nvl
nvl2
(),但奇怪的是,您可以使用旧的Oracle解码函数,它将匹配空值,例如decode(null,null,'it is null','it NOT null')将返回'it is null'。LordPeter,也许这就是为什么
decode
多次被视为空相关函数,例如
nvl
nvl2
()