Oracle select 查询不获取值为空的记录

Oracle select query does not fetch records where value is null

我有一个 Oracle DB 查询,我想从 table 中获取所有此类记录,其中 DECISION 的值 不等于丢弃。 我 运行 以下查询:

select * from TABLE where DECISION != 'Discard'

我的数据库中有两条记录,但两条记录的 DECISION 均为空,不等于 DISCARD。但是,我没有得到任何记录。

所以,我不得不将查询更改为以下成功获取记录的查询。

select * from TABLE where (DECISION != 'Discard' or DECISION is null)

我很困惑两者之间有什么区别。

您可以使用NVL

select *  from TABLE where NVL(DECISION,'x') != 'Discard'

“问题”出在三个值SQL logik

if DECISION is NULL than DECISION != 'Discard' returns not TRUE but UNKNOWN (这意味着不知道DECISION是否是Discard 或不)。

详见Oracle Documentation

a != NULL gives UNKNOWN for any value of a

要让所有行测试一个 nullable 列,您必须使用 NVL 或可能的 COALESCE(= 更多“标准”)

根据设计/定义,NULL 是一个特殊值,表示 unknown/inapplicable。与 NULL 进行的任何比较都是 UNKNOWN,在 Oracle 的 three-valued 逻辑 (https://en.wikipedia.org/wiki/Three-valued_logic) 中既不是 TRUE 也不是 FALSE.

您的第一个谓词:

where DECISION != 'Discard'
对于具有 NULL 决定的记录,

评估为 UNKNOWNWHERE 子句仅包括谓词为 TRUE 的行。由于 UNKNOWNTRUE 不同,您的第一个谓词排除了 NULL 个值。

你的第二个谓词:

where (DECISION != 'Discard' or DECISION is null)

计算为 (UNKNOWN OR TRUE),后者又计算为 TRUE。因此,您的第二个谓词包含 NULL 值。