语句 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) 上使用基于函数的索引)。