为什么 NOT IN 与 SQL 中的子查询和列的行为不同? [重复]

问题描述 投票:0回答:1

我们知道,当在具有 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

链接到 db-fiddle

sql null where-clause
1个回答
0
投票

NULL 不是一个值,而是没有值。传统上,您不能使用

=
<>
等相等运算符来与 NULL 进行比较。与 NULL 比较的结果将导致 INDETERMINATE,而不是布尔值。

IN
NOT IN
构造在底层使用了相等运算符。例如,您最好重写查询以使用
NOT EXISTS
,它不关心 NULL 或非 NULL 值,而是关心行的存在。

© www.soinside.com 2019 - 2024. All rights reserved.