【发布时间】: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)。
谢谢:)
【问题讨论】:
-
因为
null绝不是=或!=任何值。要与null进行比较,您应该始终使用is null或is not null。检查此文档docs.oracle.com/cd/B19306_01/server.102/b14200/… -
感谢您的回答@hotfix 但是,我找到了这篇文章:stackoverflow.com/questions/8036691/…