【问题标题】:SQL query does not return the expected results - It omit the Null valuesSQL 查询未返回预期结果 - 它省略了 Null 值
【发布时间】:2018-08-22 22:25:54
【问题描述】:

我尝试以一种简单的方式过滤我的数据:

SELECT * FROM INFO_CA
WHERE DATE_FACT > TO_DATE('20160101', 'YYYYMMDD')
AND ACCOUNT_SOC <> 'BELGIUM'

此查询返回 111 926 条记录。

  • 按日期过滤后,我的表 INFO_CA 中有 10 457 262 条记录。
  • ACCOUNT_SOC 列中有 296 条记录为“BELGIUM”
  • ACCOUNT_SOC 中有 111926 条记录与 BELGIUM 不同
  • ACCOUNT_SOC 中有 10 345 040 个空值。

如果我使用第二个查询,我会得到我期望的结果(10 456 966 条记录 = 10 345 040 空 + 111 926 条,而不是比利时)

SELECT * FROM INFO_CA
WHERE DATE_FACT > TO_DATE('20160101', 'YYYYMMDD')
AND (ACCOUNT_SOC <> 'BELGIUM' OR ACCOUNT_SOC IS NULL)

我正在使用 Oracle 12 (SQL Developer) + Talend。即使在 Talend 中,我的第一个查询也不返回空值。

那为什么?为什么我的第一个查询只返回值不同于 BELGIUM 或 null 的记录。为什么我必须指定我想要 ACCOUNT_SOC 为 null 的记录?

ACCOUNT_SOC 的数据类型是 VARCHAR2(255 BYTE)。

谢谢:)

【问题讨论】:

标签: sql oracle


【解决方案1】:

NULL 表示该值未知。 因此,在 ACCOUNT_SOC 字段中为 null 的值将不符合条件 ACCOUNT_SOC 'BELGIUM',因为在 NULLS 的情况下 ACCOUNT_SOC 是未知的。 它不是比利时,也不是比利时——它不为人所知。

总之,NULLS 可能很棘手,所以最好的办法是做一些研究,这样你就知道它们会产生什么影响。

你也可以

NVL(ACCOUNT_SOC,'XXX') <> 'BELGIUM'

这会将 NULL 值转换为“XXX”,然后您可以可靠地检查它

【讨论】:

    【解决方案2】:

    使用 NOT EXISTS 的替代方法 在处理 NOT IN 和 NULLS 时有一个棘手的问题,通过使用 NOT EXISTS 和键列的 JOIN 会在结果中带来 NULL。

    SELECT * FROM INFO_CA a
    WHERE NOT EXISTS (SELECT 1 FROM  INFO_CA b WHERE /*join of key columns*/ a.PK_col=b.PKcol AND b.ACCOUNT_SOC = 'BELGIUM' )
    AND a.DATE_FACT > TO_DATE('20160101', 'YYYYMMDD')
    

    【讨论】:

      猜你喜欢
      • 2020-08-23
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 2014-06-23
      相关资源
      最近更新 更多