SQLServer中NOT IN语句的使用隐患

本文探讨了在使用SQL NOTIN语句时遇到的问题,尤其是在子查询结果集包含NULL值时可能导致查询失效。作者提供了NOT EXISTS替代方案,并介绍了如何处理NULL值以确保正确查询。重点在于预防和解决NULL引发的查询隐患。
摘要由CSDN通过智能技术生成

【ASP+SQL Server】
做项目时,要写一个功能,是找出表A中不存在于表B的id。习惯写法WHER 列名 NOT IN (集合)


一开始的思路也是用Not In语句,刚开始用着挺正常,后来突然什么数据都查不出来了。上网找了许久,发现是因为Not In语句这种写法存在隐患,不注意就掉坑里了。
存在隐患的写法: 先看个简单的例子
SELECT 1 FROM test WHERE 1 NOT IN (2,null)

这个代码运行结果是什么呢?是输出1吗?不是的,答案是没有输出结果,就像我遇到的什么数据都查不出来的情况。
为什么没有输出结果呢?
因为数据库管理系统在执行查询之前会对上面的语句进行简单的转化,转化后的语句如下:

SELECT 1 FROM test WHERE 1!=2 AND 1!=null 

1!=2结果为true,但是1!=null的结果是不确定,然后true和不确定相与,结果为非ture,所以上面的语句没有结果显示。
而我之所以会遇到那个问题,也是因为我的集合里包含有null存在,所以导致查不到数据。
怎么解决这个问题呢?
最直接的办法,从根源解决问题,那就是不用NOT IN语句,而是换一种能达到同样目的的写法。例如NOT EXISTS子句。

	SELECT id FROM A WHERE NOT EXISTS( 
		SELECT * FROM B WHERE A.ID=B.ID 
	)

如果非要用Not IN的话,可以先对子查询的返回结果进行处理,如果为null就赋予它一个非空的值。相应方法有ISNULL函数。


小结: 在使用NOT IN语句的时候,记得考虑子查询结果集中是否包含NULL值。若包含则存在隐患需要想办法消除隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值