【问题标题】:What is the difference between "IS NOT NULL" and "NOT IN NULL"? Why these two Oracle queries return different results?“IS NOT NULL”和“NOT IN NULL”有什么区别?为什么这两个 Oracle 查询返回不同的结果?
【发布时间】:2017-08-02 10:40:08
【问题描述】:
  1. 从 DUAL 中选择 DUMMY 其中 DUMMY 不为 NULL;

    结果:返回“X”;

  2. 从 DUAL 中选择 DUMMY WHERE DUMMY NOT IN NULL;

    结果:什么都不返回。

【问题讨论】:

标签: oracle


【解决方案1】:

在 Oracle 中,二进制表达式可以评估为三种状态:TRUEFALSENULL,其中 NULL 可以被认为与未定义或未知值相同。对NULL 值应用二元运算将给出NULL 输出(而不是,如您所料,TRUEFALSE):

Boolean Operation Result
----------------- ------
X = X             TRUE
X = Y             FALSE
X = NULL          NULL
NULL = X          NULL
NULL = NULL       NULL
NULL IN ( NULL )  NULL
NOT TRUE          FALSE
NOT FALSE         TRUE
NOT NULL          NULL

查询:

SELECT DUMMY FROM DUAL WHERE DUMMY NOT IN ( NULL )

相当于:

SELECT DUMMY FROM DUAL WHERE NOT( DUMMY = NULL )

WHERE 子句将NOT( DUMMY = NULL ) 计算为NOT NULL,而NOT NULL 又计算为NULL。由于WHERE 过滤器的计算结果为非TRUE 值,因此该行被排除在外。

IS NULL 操作专门用于测试一个值是否为 NULL,并且会在相等 = 运算符或 IN 运算符不会的情况下执行您想要的操作。

所以:

Boolean Operation Result
----------------- ------
NULL = NULL       NULL
NULL IN ( NULL )  NULL
NULL IS NULL      TRUE

【讨论】:

    【解决方案2】:
    1. DUAL 中的 DUMMY 是 varchar2,并且您从 DUAL 中选择了所有非空 (IS NOT NULL) 的 DUMMY。 DUAL 有一行 DUMMY='X'。
    2. 现在您说 DUMMY 不在一组 NULL 中,这实际上没有任何意义,并且 select 不会返回任何结果。

    NULL 是一个特殊字符,并且不为零。它表示缺少真实数据(包括零和空格的数据)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多