关于msql下,使用NOT IN/IN 出现包含NULL值导致查询结果出错

原查询语句:

SELECT `DEVICE_NO`,`SYS_NO`,`STATION_NO` ,`DEVICE_NAME`,`DEVICE_TYPE_NO` FROM `dic_device`

WHERE `STATION_NO`=8

AND `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`=8
		AND `DEVICE_NO` LIKE '%POWER%'
		AND (`DEVICE_TYPE_NO` IS NULL OR (`DEVICE_TYPE_NO` NOT IN(SELECT `DEVICE_TYPE_NO` FROM `dic_device_alarm`)))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值