1,select *from 表 where NVL(字段名A,'') = '';
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = ';两句的执行结果不一样
第一句查不出数据
第二句可以查到数据这个如何解释?
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = ';两句的执行结果不一样
第一句查不出数据
第二句可以查到数据这个如何解释?
NVL lets you replace a null (blank) with a string in the results of a querywith t as
(
select 'a' id , '' name from dual
union all
select 'b' id , 'bb' name from dual
union all
select 'c' id , 'cc' name from dual
)--select *from t where NVL(t.name,'') = '';
SELECT *FROM t WHERE t.name IS NULL OR t.name = '';
说白了 就是oracle sql中的null 必须是用is去判断 不能用 =
并不是总会去做替代的。
第一句,你的nvl(字段名A,'') = '',由于oracle中''就是null,而null = null的值为false,所以你的第一句SQL是查不出来null值的记录。第二句,你的字段名A IS NULL 是可以查出来null值的记录的。
NVL(字段名A,'') = '';相当于什么就没做,''和NULL在ORACLE中是一样的。
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = '';
with tmp_Data as (
select 1 ID, Null V_NULL, '' V_STR from dual --空字符跟Null对比
union
select 2 ID, '' V_NULL, '' V_STR from dual --空字符跟空字符对比
union
select 3 ID, Null V_NULL, Null V_STR from dual --NULL跟Null对比
)
select id,
case when v_NULL=V_STR then 1 else 0 end 是否相等,
case when nvl(v_NULL, '') = V_STR then 1 else 0 end 是否相等_NVL
from tmp_Data;