为什么此查询返回一个空集:
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会污染整个查询。
答案 0 :(得分:12)
x NOT IN(...)定义为x与子查询返回的每个值之间的一系列比较。 SQL使用三值逻辑,逻辑表达式的三个可能值为 true , false 或 unknown 。值与NULL的比较是未知,如果其中任何一个NOT IN比较 unknown ,那么结果也被认为是 unknown
答案 1 :(得分:3)
与null比较总是一个坏主意。即使NULL = NULL
或NULL <> 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 null
和is 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 ( . . . )