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
或不)。
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
决定的记录, 评估为 UNKNOWN
。 WHERE
子句仅包括谓词为 TRUE
的行。由于 UNKNOWN
与 TRUE
不同,您的第一个谓词排除了 NULL
个值。
你的第二个谓词:
where (DECISION != 'Discard' or DECISION is null)
计算为 (UNKNOWN OR TRUE)
,后者又计算为 TRUE
。因此,您的第二个谓词包含 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
或不)。
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
决定的记录, 评估为 UNKNOWN
。 WHERE
子句仅包括谓词为 TRUE
的行。由于 UNKNOWN
与 TRUE
不同,您的第一个谓词排除了 NULL
个值。
你的第二个谓词:
where (DECISION != 'Discard' or DECISION is null)
计算为 (UNKNOWN OR TRUE)
,后者又计算为 TRUE
。因此,您的第二个谓词包含 NULL
值。