ORACLE 中 NOT IN with NULL 值的困境 SQL

The NOT IN with NULL values dilemma in ORACLE SQL

当我使用这段代码时

WHEN col1 NOT IN (SELECT col2 FROM table_name) THEN 'something'

它没有给出预期的结果,知道 col2 包含 NULL 值,为什么会这样?将 IN 与 NULL 值一起使用会混淆存储在内存中的数据还是什么?

这不是 Oracle 的问题。 SQL就是这样定义的。

当子查询 returns 具有 NULLNOT IN 时,则根本没有行匹配。出于这个原因,我强烈建议 always 使用 NOT EXISTS 代替:

WHEN NOT EXISTS (SELECT 1 FROM bst WHERE x.n = bst.p)
     THEN 'Leaf'

作为推论,我通常使用EXISTS而不是IN,即使它没有这个问题。

为什么会出现这种情况? NULL 表示该值为 未知 ,而不是该值为 "missing" 或其他值。

所以,如果所有元素都有值,这很容易计算:

1 NOT IN (1, 2)  --> false
3 NOT IN (1, 2)  --> true

但是:

1 NOT IN (1, 2, NULL)  --> false 
3 NOT IN (1, 2, NULL)  --> NULL, because NULL could be equal to "3"

基本上,如果 any 值为 NULL,则 NOT IN returns "false" 或 NULL . "false" 和 NULLWHENWHERE 中的处理方式相同。