暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中使用NOT IN为NULL

ASKTOM 2019-05-29
573

问题描述

早上好。

根据Oracle文档:https://docs.oracle.com/database/121/SQLRF/conditions014.htm#SQLRF52169
“如果在NOT in操作之后的列表中的任何项目的结果为null,则所有行的结果为FALSE或UNKNOWN,并且不返回任何行。”

所以我做了一些测试:
SQL> set serveroutput on
SQL> set echo on
SQL> 
SQL> select 'true'
  2  from dual
  3  where (1) not in (2,null);
no rows selected
复制

这看起来是正确的。

SQL> 
SQL> select 'true'
  2  from dual
  3  where (1) not in (null, 2);
no rows selected
复制

这看起来也是正确的。

SQL> 
SQL> 
SQL> select 'true'
  2  from dual
  3  where (1,2) not in ((2,null));

'TRU
----
true
复制

是正确的还是我错过了什么?

SQL> 
SQL> select 'true'
  2  from dual
  3  where (1,2) not in ((null,2));
no rows selected
复制

这看起来是正确的。

因此,它看起来就像它在文档中描述的那样,只有当我们检查一个字段时
使用NOT IN,而对于多个,它仅在空值首先出现在列表中时才按预期工作。

致以最良好的问候。
皮奥特

专家解答

用 “未知” 值来考虑null。因此

选择 “true”
从双重
其中 (1) 不在 (2,null) 中;

* 可能 * 是真的,也可能是假的。我们不知道,因为 'null' 可能是1或2。所以我们不能给你一个确凿的答案,因为它是不确定的。

但是在这种情况下

选择 “true”
从双重
其中 (1,2) 不在 ((2,null)) 中;

1!= 2表示无论未知值等同于什么,它都永远不可能是匹配,因此NOT IN是有效的

鉴于

选择 “true”
从双重
其中 (1,2) 不在 ((null,2)) 中;

* 可能 * 是真的,也可能是假的。我们不知道,因为 “空” 可能是1或2
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论