ORACLE SQL 中 NOT IN 与 NULL 值的困境

Abd*_*mam 2 sql oracle null sql-in

当我使用这段代码时

WHEN col1 NOT IN (SELECT col2 FROM table_name) THEN 'something'
Run Code Online (Sandbox Code Playgroud)

知道 col2 包含 NULL 值,它没有给出预期结果,为什么会发生这种情况?将 IN 与 NULL 值一起使用是否会扰乱内存中存储的数据还是什么?

Gor*_*off 8

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

当子查询返回NULL带有 的值时NOT IN,则根本没有行匹配。因此,我强烈建议始终使用NOT EXISTS

WHEN NOT EXISTS (SELECT 1 FROM bst WHERE x.n = bst.p)
     THEN 'Leaf'
Run Code Online (Sandbox Code Playgroud)

作为推论,我通常使用EXISTS代替IN,即使它不存在这个问题。

为什么会出现这种情况? NULL意味着该值是未知的,而不是该值“丢失”或其他东西。

因此,如果所有元素都有值,则很容易计算:

1 NOT IN (1, 2)  --> false
3 NOT IN (1, 2)  --> true
Run Code Online (Sandbox Code Playgroud)

然而:

1 NOT IN (1, 2, NULL)  --> false 
3 NOT IN (1, 2, NULL)  --> NULL, because NULL could be equal to "3"
Run Code Online (Sandbox Code Playgroud)

基本上,如果任何值为NULL,则NOT IN返回“false”或NULL。和中的“假”和 的NULL处理方式相同。WHENWHERE