这个问题在这里已经有答案了:
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
). 但是,上面的第二个查询将不返回任何行。为什么会这样?
1条答案
按热度按时间nnvyjq4y1#
不要使用
not in
使用子查询。句号。使用not exists
; 它做你想做的:问题是这个。当您有:
sql实际返回
NULL
,不是false
. 然而,NULL
被视为false
在where
条款(和when
条款,但不适用于check
约束条件)。所以,行被过滤掉了。当你否定这一点时,要么是:
结果是
not NULL
这也是NULL
一切都被过滤掉了。唉。在我看来,最简单的解决办法就是养成使用的习惯
not exists
.