是个很简单的问题。表里面的数据:
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么?这太累赘了。
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么?这太累赘了。
解决方案 »
- oracle 10g数据导入oracle11g乱码问题??
- 创建表空间失败
- 请教高手,windows2000 sp4安装ORACLE8.1.7出错
- 9999.无法启动OracleOraDb10g_home1iSQL*Plus服务。。。
- 送分30分:请问ORACLE的日志文件、审计的作用
- 打击死了
- 急!!!关于Ajax的问题!
- 高手留步,在Insert一条语句后,如何得到刚插入后的RowID值.在线等.
- 一个表上的一个字段建立了索引 这个表的这个字段与别的表连接时 速度会提高吗
- 更新语句不会写,调试老不会通过。
- system表空间有坏块,求处理办法。ora-01578
- ORACLE 循环的问题,请指点。
select *
from product_all
where nvl(id2,'0') <> 2
嗯,至少这样看起来比再加一个or条件要简洁一点。
不过还是要求执行者要记得这样用。我发现我以前写sql都没有注意过这个,也没出现过错误,恐怕是因为那些字段恰好有not null限制或者恰好没有空值记录。否则一定会有问题啊。
想想都后怕。