关于null值比较的问题

neverland_83 2013-09-18 11:35:01
是个很简单的问题。

表里面的数据:
SQL> select * from product_all;

ID1 AMOUNT ID2 WEIGHT EXIST
---------- ---------- ---------- ---------- ----------
2 200 2 22 0
4 400 4 44 1
3 300
1 100

查询语句:
SQL> select * from product_all where id2<>2;

ID1 AMOUNT ID2 WEIGHT EXIST
---------- ---------- ---------- ---------- ----------
4 400 4 44 1

按照人的通常思维,值为空,当然也是不等于2的,所以本来想能将后面两条记录查出来,但实际查不出来。

这个原因其实我是明白的。
因为oracle里面null值是不能用比较运算符的,任何比较得到的结果都是false,所以后面两条id2字段为null的记录查不出来。
要想查出来这些记录,必须加一个条件or id2 is null

但是我的问题是,oracle的这种特性会给应用带来困惑:
第一,这要求做应用的人必须知道字段的准确属性,是否可能为null,并且时刻牢记
第二,还要求做应用的人必须时刻牢记oracle null值比较的特性
但是这其实与人普通思维有悖,应用的人很容易忘记加or id2 is null的条件。

大家都是怎么做的,难道所有非等值比较都去加一个is null么?这太累赘了。

...全文
267 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
-无-为- 2013-09-25
  • 打赏
  • 举报
回复
nvl(id2,'0')和表字段添加非空约束
huendan05 2013-09-22
  • 打赏
  • 举报
回复
select * from product_all where nvl(id2,'0') <> 2
tumblewind 2013-09-21
  • 打赏
  • 举报
回复
用nvl转换就行了。
zhangyansg 2013-09-20
  • 打赏
  • 举报
回复
nvl可以满足,nvl(a,b)是a为null的时候转换为b
善若止水 2013-09-20
  • 打赏
  • 举报
回复
引用 2 楼 HJ_daxian 的回复:
转换了对比

select * 
from product_all 
where nvl(id2,'0') <> 2
很好,支持,我也是这么用的
无敌小二傻 2013-09-18
  • 打赏
  • 举报
回复
引用 2 楼 HJ_daxian 的回复:
转换了对比

select * 
from product_all 
where nvl(id2,'0') <> 2
+1
姜小白- 2013-09-18
  • 打赏
  • 举报
回复
is null 是Oracle查询比较中常用的条件字段,貌似没有什么好办法
请叫我-雷人 2013-09-18
  • 打赏
  • 举报
回复
我也认为没有什么好的办法
  • 打赏
  • 举报
回复
转换了对比

select * 
from product_all 
where nvl(id2,'0') <> 2
  • 打赏
  • 举报
回复
貌似没有好的方法,加上or语句应该是最简单的方式了
现在 2013-09-18
  • 打赏
  • 举报
回复
学习了。。。
neverland_83 2013-09-18
  • 打赏
  • 举报
回复
引用 2 楼 HJ_daxian 的回复:
转换了对比

select * 
from product_all 
where nvl(id2,'0') <> 2
嗯,至少这样看起来比再加一个or条件要简洁一点。 不过还是要求执行者要记得这样用。 我发现我以前写sql都没有注意过这个,也没出现过错误,恐怕是因为那些字段恰好有not null限制或者恰好没有空值记录。否则一定会有问题啊。 想想都后怕。
pobaby 2013-09-18
  • 打赏
  • 举报
回复
oracle 所以 诞生 了 NVL 函数处理这个 null 的问题。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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