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 具有 NULL
值 NOT 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" 和 NULL
在 WHEN
和 WHERE
中的处理方式相同。
当我使用这段代码时
WHEN col1 NOT IN (SELECT col2 FROM table_name) THEN 'something'
它没有给出预期的结果,知道 col2 包含 NULL 值,为什么会这样?将 IN 与 NULL 值一起使用会混淆存储在内存中的数据还是什么?
这不是 Oracle 的问题。 SQL就是这样定义的。
当子查询 returns 具有 NULL
值 NOT 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" 和 NULL
在 WHEN
和 WHERE
中的处理方式相同。