使用空值理解sql in子句

t5fffqht  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(388)

这个问题在这里已经有答案了

not in子句中的空值(12个答案)
oracle sql中not in with null values的困境(1个答案)
11个月前关门了。
假设下表:

CREATE TABLE X (x_name VARCHAR(100));
CREATE TABLE Y (y_name VARCHAR(100));
INSERT INTO X VALUES ('blue');
INSERT INTO X VALUES ('red');
INSERT INTO Y VALUES ('blue');

导致:

+---------+        +---------+
| Table X |        | Table Y |
+---------+        +---------+
|  x_name |        |  y_name |
+---------+        +---------+
|  'blue' |        |  'blue' |
|   'red' |        +---------+
+---------+

以下查询的结果与预期一致: SELECT * FROM X WHERE x_name IN (SELECT y_name FROM Y); 将返回一行 | 'blue' | . SELECT * FROM X WHERE x_name NOT IN (SELECT y_name FROM Y); 将返回一行 | 'red' | .
让我们插入 NULL 进入表y:

INSERT INTO Y VALUES (NULL);

第一个查询将返回相同的结果( blue ). 但是,上面的第二个查询将不返回任何行。为什么会这样?

nnvyjq4y

nnvyjq4y1#

不要使用 not in 使用子查询。句号。使用 not exists ; 它做你想做的:

select x.*
from x
where not exists (select 1 from y where y.y_name = x.x_name);

问题是这个。当您有:

x_name in ('a', 'b', null)

sql实际返回 NULL ,不是 false . 然而, NULL 被视为 falsewhere 条款(和 when 条款,但不适用于 check 约束条件)。所以,行被过滤掉了。
当你否定这一点时,要么是:

not x_name in ('a', 'b', null)
x_name not in ('a', 'b', null)

结果是 not NULL 这也是 NULL 一切都被过滤掉了。
唉。在我看来,最简单的解决办法就是养成使用的习惯 not exists .

相关问题