不要使用 NOT IN 有子查询!当子查询返回 NULL 价值,它有你看到的行为。不返回任何行。 我强烈建议 NOT EXISTS 或者 LEFT JOIN / WHERE 因为这个原因。所以:
select a
from xo
where not exists (select 1 from xo xo2 where xo2.c = xo.a);
这将返回以下内容的补码:
select a
from xo
where exists (select 1 from xo xo2 where xo2.c = xo.a);
发生这种情况的技术原因是 NULL 是未知值,不是特殊值。所以:
1 in (1, 2, 3) returns TRUE
1 not in (1, 2, 3) returns FALSE
但是:
1 in (1, 2, 3, NULL) returns TRUE, because 1 is explicitly in the list
1 in (2, 3, NULL) returns NULL (equivalent to FALSE) because `NULL` could be 1 or not
以及:
1 not in (1, 2, 3, NULL) returns FALSE because 1 is explicitly in the list
1 not in (2, 3, NULL) returns NULL, because 1 could be in the list
所以,当任何值 NULL , NOT IN 返回false或 NULL --因此,所有行都被过滤掉。
2条答案
按热度按时间neskvpey1#
不要使用
NOT IN
有子查询!当子查询返回NULL
价值,它有你看到的行为。不返回任何行。我强烈建议
NOT EXISTS
或者LEFT JOIN
/WHERE
因为这个原因。所以:这将返回以下内容的补码:
发生这种情况的技术原因是
NULL
是未知值,不是特殊值。所以:但是:
以及:
所以,当任何值
NULL
,NOT IN
返回false或NULL
--因此,所有行都被过滤掉。noj0wjuj2#
这是因为
NULL
在sql中,s被特别处理。当你把某件事和NULL
它返回unknown,这反过来又使比较失败NOT IN
条件。这是建议使用的原因之一
EXISTS()
结束NOT IN
.小提琴