13

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

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。(为了简洁起见,我添加了限制 5,并且我使用的是 MySql 5.1)


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

WHERE user_id NOT IN( select user_id from mailsubscriptions )

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

4

4 回答 4

21

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

于 2013-04-16T13:42:27.553 回答
3

与 null 比较总是一个坏主意。甚至NULL = NULLNULL <> NULL将返回NULL。

使用IS NOT NULLinsetad

在您的情况下,查询与以下内容相同:

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

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

于 2013-04-16T13:30:32.953 回答
0

不要将 NULL 与 NULL 进行比较

您需要在IS NOT NULL此处指定

于 2013-04-16T13:30:11.967 回答
0

与 NULL 的任何比较(除is nulland外)都is not null返回 NULL,出于布尔目的将其解释为 false。这是所有数据库的标准行为。

如果您想在一组值中进行比较,这里有两个选项:

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

这假定 -1 是 id 的无效值。或者,您可以进行显式比较:

where produit_id is not null and produit_id not in ( . . . )
于 2013-04-16T13:36:18.663 回答