AND字段NOT IN(NULL)返回一个空集

时间:2013-04-16 13:28:48

标签: mysql sql

为什么此查询返回一个空集:

select p.iuser_id,p.produit_id from portefeuille p
WHERE produit_id=48
AND p.iuser_id NOT IN (NULL);

而这一个:

select p.iuser_id,p.produit_id from portefeuille p
WHERE produit_id=48
LIMIT 5

返回结果

72968, 48
106967, 48
7381, 48
81678, 48
194250, 48

并且这些值都不是NULL或应该等于NULL。 (我为consiseness添加了限制5,我使用的是MySql 5.1)


编辑:这里我将问题缩小到NOT IN(NULL)。原始查询有一个子查询,其中一些行包含NULL,如下所示:

WHERE user_id NOT IN( select user_id from mailsubscriptions )

并且一些user_id为NULL,但集合中只有一个NULL会污染整个查询。

4 个答案:

答案 0 :(得分:12)

x NOT IN(...)定义为x与子查询返回的每个值之间的一系列比较。 SQL使用三值逻辑,逻辑表达式的三个可能值为 true false unknown 。值与NULL的比较是未知,如果其中任何一个NOT IN比较 unknown ,那么结果也被认为是 unknown

答案 1 :(得分:3)

与null比较总是一个坏主意。即使NULL = NULLNULL <> NULL也会返回NULL。

使用IS NOT NULL insetad

在您的情况下,查询与:

相同
select p.iuser_id,p.produit_id from portefeuille p
WHERE produit_id=48
AND p.iuser_id <> NULL;

,无论p.iuser_id <> NULL的值如何,p.isuer_id的值都将为NULL,这就解释了为什么它返回一个空集!

答案 2 :(得分:0)

不要将NULL与NULL进行比较

您需要在此处指定IS NOT NULL

答案 3 :(得分:0)

除了is nullis not null之外,与NULL的任何比较都会返回NULL,对于布尔目的,它被解释为false。这是所有数据库的标准行为。

如果您想在一组值中进行比较,可以选择以下两个选项:

where coalesce(produit_id, -1) not in (-1, . . . .)

这假设-1是id的无效值。或者,您可以进行明确的比较:

where produit_id is not null and produit_id not in ( . . . )