语句 Oracle Sql 中 where 子句中的空值
Null values in where clause at in statement Oracle Sql
我知道我不能简单地说 NULL 值等于某个整数等。但我想知道 NULL = 5 或类似内容的输出是什么。我也不认为这是错误的,因为下面的代码。
select *
from hr.employees
where
NOT (
COMMISSION_PCT IN (.4,.3,.2,.25,.15,.35,.1)
)
我想当 commission_pct 为 null 时,它既不是真也不是假。在这些类型的问题中,处理空值的最佳做法是什么?为了谨慎起见,我是否应该在每个非空列中使用如下所示的内容?
select *
from hr.employees
where
NOT (
NVL(COMMISSION_PCT,.99) IN (.4,.3,.2,.25,.15,.35,.1)
)
正如您所说“我不能简单地说 NULL 值等于某个整数”。因此 NULL = 5
将结果为 null 并且 return 没有行。
有趣的是,如果比较的值中有任何空值,结果仍然是空值。例如 -
WHERE COMMISSION_PCT IN (4, 3, 2, 25, 15, 35, 1, NULL);
这会将 COMMISSION_PCT 的值与 null 进行比较,最终将变为 false,并且没有行会 return。
对可为空的列使用 NVL 函数总是更好。就像你说的-
NVL(COMMISSION_PCT,.99) IN (.4,.3,.2,.25,.15,.35,.1)
添加与NULL
的比较:
SELECT *
FROM hr.employees
WHERE COMMISSION_PCT NOT IN (.4,.3,.2,.25,.15,.35,.1)
OR COMMISSION_PCT IS NULL;
如果您使用 NVL
,那么 Oracle 将不会在该列上使用索引(您需要在 NVL(commission_pct, 0.99)
上使用基于函数的索引)。
我知道我不能简单地说 NULL 值等于某个整数等。但我想知道 NULL = 5 或类似内容的输出是什么。我也不认为这是错误的,因为下面的代码。
select *
from hr.employees
where
NOT (
COMMISSION_PCT IN (.4,.3,.2,.25,.15,.35,.1)
)
我想当 commission_pct 为 null 时,它既不是真也不是假。在这些类型的问题中,处理空值的最佳做法是什么?为了谨慎起见,我是否应该在每个非空列中使用如下所示的内容?
select *
from hr.employees
where
NOT (
NVL(COMMISSION_PCT,.99) IN (.4,.3,.2,.25,.15,.35,.1)
)
正如您所说“我不能简单地说 NULL 值等于某个整数”。因此 NULL = 5
将结果为 null 并且 return 没有行。
有趣的是,如果比较的值中有任何空值,结果仍然是空值。例如 -
WHERE COMMISSION_PCT IN (4, 3, 2, 25, 15, 35, 1, NULL);
这会将 COMMISSION_PCT 的值与 null 进行比较,最终将变为 false,并且没有行会 return。
对可为空的列使用 NVL 函数总是更好。就像你说的-
NVL(COMMISSION_PCT,.99) IN (.4,.3,.2,.25,.15,.35,.1)
添加与NULL
的比较:
SELECT *
FROM hr.employees
WHERE COMMISSION_PCT NOT IN (.4,.3,.2,.25,.15,.35,.1)
OR COMMISSION_PCT IS NULL;
如果您使用 NVL
,那么 Oracle 将不会在该列上使用索引(您需要在 NVL(commission_pct, 0.99)
上使用基于函数的索引)。