【问题标题】:Null query result cant fetch in Select query in Oracle在 Oracle 中的 Select 查询中无法获取空查询结果
【发布时间】:2019-08-29 13:05:55
【问题描述】:

我有以下查询,我正在尝试运行但未返回预期结果。 ISINEXPORT_BB 中为 Null 的字段值也被忽略,并且不显示具有NOT IN 子句中给出的条件的结果。 export_blacklist 只有一个行值,并且不是 Null,但我仍然不知道由于什么原因 null 值被忽略。

Select * from EXPORT_BB where ISIN NOT IN
    (
        SELECT
            ISIN
        FROM
            export_blacklist);

如果我只运行不带 NOT IN 子句的 select 查询,那么我可以看到 NULL 的值是 ISIN 字段。

只是为了测试,我尝试了下面的查询,但也没有任何结果。是 Oracle 18c 中的错误还是缺少某些东西?

select 'null is not in set' from dual where null not in (select 1 from dual);

【问题讨论】:

  • 您需要说明isin is null or isin not in... null 既不是in 也不是not in 任何结果集...

标签: sql oracle select null


【解决方案1】:

NULL=<><>INNOT IN 子句中的任何比较都将返回 NULL,因此该行不包含在结果(因为只有返回值为TRUE 的行才会包含在结果中)。
ISINNULL 的情况下更改您的代码:

SELECT * FROM EXPORT_BB 
WHERE ISIN NOT IN (SELECT ISIN FROM export_blacklist)
OR ISIN IS NULL

【讨论】:

  • 我猜如果 EXPORT_BB 中有 NULL 并且 EXPORT_BLACKLIST 中没有,那么 OP 不会想要该行...
  • @btpys 再次阅读问题:EXPORT_BB 中为 Null 的 ISIN 字段值也被忽略,并且不显示 NOT IN 子句中给出的条件的结果。 OP希望看到NULLs
  • sry,你说得对,我的意思是如果 EXPORT_BLACKLIST 中也有 NULL。因此,如果两个表中都有 NULL,我猜 OP 不会想看到它。
  • export_blacklist 只有一个行值,并且不是问题中的 Null
  • 是的,这就是问题所在,但我更进一步,OP 将 NULL 视为常规值,所以我猜测如果两个表中都有 NULL,他不会想要它。
【解决方案2】:

NULL 值不适用于NOT IN,这是正常行为。

您必须将 NULL 转换为另一个值才能对其进行操作或使用IS NULL/IS NOT NULL

Select * from EXPORT_BB where NVL(ISIN, 999999) NOT IN
    (
        SELECT
            NVL(ISIN, 999999)
        FROM
            export_blacklist);

【讨论】:

    【解决方案3】:

    与 Oracle 中的空值比较总是返回 false。

    NULL >= 1 吗?没有。

    NULL

    你的集合中有NULL吗?不管你的套装是什么,答案是否定的。

    NULL 不在你的集合中吗?再次,没有。

    【讨论】:

    • 。 .从技术上讲,它返回 NULL WHERE 子句视为 false。
    • 在 NOT EXISTS 场景的情况下会考虑 NULLS
    【解决方案4】:

    这是预期的行为。与 18c 无关,从 Oracle 7 开始也是如此

    NOT IN 不考虑空值。

    NOT EXISTS 确实考虑空值。

    在 db fiddle 中考虑以下示例 https://dbfiddle.uk/?rdbms=oracle_18&fiddle=8be0a790d8172093a032602345038e8e

    查看关于此的讨论 https://asktom.oracle.com/pls/apex/asktom.search?tag=in-vs-exists-and-not-in-vs-not-exists

    【讨论】:

      【解决方案5】:

      正如您已被同事回答,您必须指定您也想返回空值。 即

          SELECT * 
          FROM EXPORT_BB 
          WHERE ISIN NOT IN (SELECT ISIN FROM EXPORT_BLACKLIST) 
          OR ISIN IS NULL;
      

      【讨论】:

      • 您是否只是从我的答案中复制代码并将其发布为您的代码?
      • 不。嗯,对于 Oracle 用户来说,它是非常简单的代码,所以它是普通代码相似或看起来相同;)就像如果我说你如果你写“SELECT SYSDATE FROM DUAL”,你就复制了我的代码想法
      • 真的吗?你为什么要发布它?是不是从这个线程中丢失了?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多