在Oracle中,不等于(!=)运算符不像预期那样工作。

22 浏览
0 Comments

在Oracle中,不等于(!=)运算符不像预期那样工作。

我在我的数据库表中新建了一列:

alter table TABLE add (COLUMN NUMBER(1));

现在,我想选择所有记录,其中列的值不为零,可以是其他数字或为空(null)。

SELECT * FROM TABLE WHERE COLUMN != 0;

默认情况下,所有列都具有空/ null值,因为这列是最近添加的,所以它应该返回所有记录,但却没有返回任何记录。

但是,如果我将某个记录的此列的值更改为0并运行下面的查询,它运行正常。

SELECT * FROM TABLE WHERE COLUMN = 0;

请帮助我,我想选择所有值不为0的记录。

0
0 Comments

问题的原因是在Oracle中,对于NULL值,使用!=运算符无法按预期工作。需要显式使用IS NULL或IS NOT NULL来判断NULL值。

解决方法之一是使用IS NULL或IS NOT NULL来判断NULL值:

SELECT * FROM TABLE WHERE COLUMN <> 0 OR COLUMN IS NULL;

另一种解决方法是使用NVL函数来处理NULL值:

SELECT * FROM TABLE WHERE NVL(COLUMN,1) <> 0

即使使用了NVL函数,优化器还是会像第一种情况一样处理。

某些情况下,优化器会像第一种情况一样处理,即使使用了NVL函数。但是并没有提供相应的参考文档来证明这一点。但是我认为这是不正确的。

0