关于msql下,使用NOT IN/IN 出现包含NULL值导致查询结果出错
来源:互联网 发布:网络结构图图标 编辑:程序博客网 时间:2024/05/16 07:36
原查询语句:
SELECT `DEVICE_NO`,`SYS_NO`,`STATION_NO` ,`DEVICE_NAME`,`DEVICE_TYPE_NO` FROM `dic_device`
WHERE `STATION_NO`=8AND `DEVICE_NO` LIKE '%POWER%'
AND `DEVICE_TYPE_NO` NOT IN(SELECT `DEVICE_TYPE_NO` FROM `dic_device_alarm`)
结果:查出的数据不符实际预期 :筛选出符合前面两处条件的数据并且 `DEVICE_TYPE_NO` 不存在于SELECT `DEVICE_TYPE_NO` FROM `dic_device_alarm`(此select语句的结果不会出现NULL的结果)。
原因:
NULL值在与任意值比较时总是假的(FALSE),并且包含NULL的一个表达式总是产生一个NULL值则上述的:AND `DEVICE_TYPE_NO` NOT IN(SELECT `DEVICE_TYPE_NO` FROM `dic_device_alarm`) 只要`DEVICE_TYPE_NO`为NULL 或者SELECT `DEVICE_TYPE_NO` FROM `dic_device_alarm` 含有NULL ,则会导致整个的查询结果为空
改进:避免`DEVICE_TYPE_NO` NOT IN()语句出现Null比较值,在我实现的业务中,SELECT `DEVICE_TYPE_NO` FROM `dic_device_alarm`不会出现NULL的情形,只需规避`DEVICE_TYPE_NO`为NULL的情况,采用OR分拆即可。
修改后查询语句:
SELECT `DEVICE_NO`,`SYS_NO`,`STATION_NO` ,`DEVICE_NAME`,`DEVICE_TYPE_NO` FROM `dic_device`WHERE `STATION_NO`=8AND `DEVICE_NO` LIKE '%POWER%'AND (`DEVICE_TYPE_NO` IS NULL OR (`DEVICE_TYPE_NO` NOT IN(SELECT `DEVICE_TYPE_NO` FROM `dic_device_alarm`)))
阅读全文
0 0
- Spark中决策树源码分析
- MySQL Innodb数据库性能实践——合适的表记录数
- 数据结构与算法开篇
- Android备忘录 -- 自定义控件
- strstream 与 backward_warning.h 的警告问题
- 关于msql下,使用NOT IN/IN 出现包含NULL值导致查询结果出错
- Shell变量
- 常见的相似或相异程度计算方法
- Java内存模型与线程01:概述
- 画虚线
- eclipse 提示:An internal error occurred during: "Building workspace". GC overhead limit exceeded
- Redis基础语法
- javascript 删除 url 中指定参数,并返回 url
- session.setAttribute和session.getAttribute