oracle NVL函数

熙熙 2011-10-11 09:54:14
1,select *from 表 where NVL(字段名A,'') = '';
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = ';

两句的执行结果不一样
第一句查不出数据
第二句可以查到数据

这个如何解释?
...全文
242 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
杨开格 2012-08-31
  • 打赏
  • 举报
回复
在Oracle中''字符和Null值是相同的,包括使用NVL处理之后;下面是测试的代码:
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;

胖胖_多多 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cosio 的回复:]
SQL code


NVL函数,如果为空,后面的参数来替代.

1,select *from 表 where NVL(字段名A,' ') = ' '; --增加空格即可
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = '';
[/Quote]
++
cosio 2011-10-11
  • 打赏
  • 举报
回复


NVL函数,如果为空,后面的参数来替代.

1,select *from 表 where NVL(字段名A,' ') = ' '; --增加空格即可
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = '';

lnuwhy 2011-10-11
  • 打赏
  • 举报
回复
1,改成select *from 表 where NVL(字段名A,'1') = '1';两个就一样了。

NVL(字段名A,'')
= '';相当于什么就没做,''和NULL在ORACLE中是一样的。


xiaobn_cn 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 kiero_jay 的回复:]
1,select *from 表 where NVL(字段名A,'') = '';
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = ';

两句的执行结果不一样
第一句查不出数据
第二句可以查到数据

这个如何解释?
[/Quote]

第一句,你的nvl(字段名A,'') = '',由于oracle中''就是null,而null = null的值为false,所以你的第一句SQL是查不出来null值的记录。

第二句,你的字段名A IS NULL 是可以查出来null值的记录的。
jimmylin040 2011-10-11
  • 打赏
  • 举报
回复
因为NVL(A,B)有一个IF的判断,如果参数A为空,则取值参数B……
并不是总会去做替代的。
YeHuai1991 2011-10-11
  • 打赏
  • 举报
回复
NULL与0、空字符串、空格都不同。
horizonlyhw 2011-10-11
  • 打赏
  • 举报
回复
这个是书面解释
NVL lets you replace a null (blank) with a string in the results of a query



with 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去判断 不能用 =
我本是朱 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiaobn_cn 的回复:]
引用楼主 kiero_jay 的回复:
1,select *from 表 where NVL(字段名A,'') = '';
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = ';

两句的执行结果不一样
第一句查不出数据
第二句可以查到数据

这个如何解释?


第一句,你的nvl(字段名A,'') = '',由于oracle中''就……
[/Quote]
这解答不仅是解决方案还是知识
天枫 2011-10-11
  • 打赏
  • 举报
回复
''=''为false
天枫 2011-10-11
  • 打赏
  • 举报
回复
NVL(c1,c2) 逻辑等价于IF c1 is null THEN c2 ELSE c1 END。c1,c2可以是任何类型。如果两者类型不同,则oracle会自动将c2转换为c1的类型。
NLP爱好者 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiaobn_cn 的回复:]
引用楼主 kiero_jay 的回复:
1,select *from 表 where NVL(字段名A,'') = '';
2,SELECT *FROM 表 WHERE 字段名A IS NULL OR 字段名A = ';

两句的执行结果不一样
第一句查不出数据
第二句可以查到数据

这个如何解释?


第一句,你的nvl(字段名A,'') = '',由于oracle中''就……
[/Quote]

正解

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧