在SQL中,如果在IN从句中出现null,将会出现完全不符合预期的情况。例如:
select * from user
where id not in (1, 2, null)
此时返回结果为空,而不是除了1,2和null以外的结果。事实上,上述not in语句相当于:
where id <> 1 and id <>2 and id<>null
null与非null数据进行比较,其结果是Unknown
,因此不会返回任何结果。
SQL中的逻辑值有3个:True,False和Unknown
。只有当计算结果为True,才会返回。出现错误的原因大多数是混淆了False和Unknown的情况。例如下面这个SQL:
SELECT *
FROM t
WHERE i = NULL;
永远不会返回返回结果,因为i = NULL
的结果是Unknown,即使当i本身也是NULL的时候也是如此,即使用等号对NULL进行比较,其结果永远是Unknown。要判断是否为NULL,使用IS NULL
。
因此,在IN从句中,千万千万要记得去掉NULL。
另外,IN语句的作用相当于多个OR并列,例如:
where id in (1,2)
相当于:
where id = 1 or id=2