我们知道,当在具有 NULL 值的子查询上使用 NOT IN 条件时,查询将不会产生任何结果,例如:
CREATE TABLE movie (
title TEXT
);
INSERT INTO movie (title) VALUES (NULL);
INSERT INTO movie (title) VALUES ('ABC');
SELECT * FROM movie
WHERE 'Titanic' NOT IN (select title from movie)
上面的查询没有返回任何结果。
但是如果查询是:
SELECT * FROM movie
WHERE 'Titanic' NOT IN (title)
然后返回带有
title=ABC
的行。为什么查询不返回相同的结果?在这两种情况下,NOT IN
条件是否都翻译为WHERE 'Titanic' != 'ABC' AND 'Titanic' != NULL
?
NULL 不是一个值,而是没有值。传统上,您不能使用
=
或 <>
等相等运算符来与 NULL 进行比较。与 NULL 比较的结果将导致 INDETERMINATE,而不是布尔值。
IN
和 NOT IN
构造在底层使用了相等运算符。例如,您最好重写查询以使用 NOT EXISTS
,它不关心 NULL 或非 NULL 值,而是关心行的存在。