在Oracle中,不等于(!=)运算符不像预期那样工作。
在Oracle中,不等于(!=)运算符不像预期那样工作。
我在我的数据库表中新建了一列:
alter table TABLE add (COLUMN NUMBER(1));
现在,我想选择所有记录,其中列的值不为零,可以是其他数字或为空(null)。
SELECT * FROM TABLE WHERE COLUMN != 0;
默认情况下,所有列都具有空/ null值,因为这列是最近添加的,所以它应该返回所有记录,但却没有返回任何记录。
但是,如果我将某个记录的此列的值更改为0
并运行下面的查询,它运行正常。
SELECT * FROM TABLE WHERE COLUMN = 0;
请帮助我,我想选择所有值不为0
的记录。
问题的原因是在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函数。但是并没有提供相应的参考文档来证明这一点。但是我认为这是不正确的。