Oracle SQL不会选择空值

9
在NAME表中,第一列为空,但没有选择任何行。请帮我理解。
SELECT * FROM NAME WHERE FIRST != '1'
5个回答

16
任何与null的比较都是false - 包括=<>><等等。你也不能在IN列表中使用null - 它会被忽略。而且,两个null甚至不相等。
要获取null值,需要明确地请求它们,就像这样:
SELECT * FROM NAME WHERE FIRST IS NULL OR FIRST != '1'

11

任何与NULL的比较都会返回NULL,它等价于FALSE。即使是不相等也是如此。

如果您想包括NULL值,请执行以下操作之一:

where first <> '1' or first is null
或者
where coalesce(first, '<null>') <> '1'

4

在Oracle中,除非您明确要求,否则null不被视为有效的选择值:

select * from name where (first != '1') or first is null

您可以使用NVL(类似于coalesce):
select * from name where nvl(first,'0') != '1'

3

那是正确的,因为NULL永远不能与其他任何东西比较....

您唯一的选择是在命令中包含一个NULL检查作为“or”的条件。

SELECT * FROM NAME WHERE FIRST!=1 OR FIRST IS NULL

根据Oracle文档,NULL被定义为一个值未知或者值没有意义的情况。这就是Oracle指出不要将0视为NULL的唯一原因。这只是供参考的附加信息。谢谢!

1

NULL很蠢。没错。

NULL是邪恶的。

如果X为NULL且Y也为NULL,则X实际上等于Y,因为它们都是NULL。

我无法说

IF X IN ('a','B','C',null)

这也是一个麻烦,但现在我必须这样说

IF ( X IN ('a','B','C') or X is NULL ) 

这样做既浪费时间,如果我忘记了括号还会存在错误的风险。

更令我不满的是,NULL本来就不应该出现。字段(呃...好吧,孩子们,我会称它们为列)应该始终被初始化。没错,停止使用nulls。不要允许它们。默认值应该总是零或空白,这样那些懒得在软件中初始化列的人也会自动初始化它们。

有很多情况下,未定义默认值为零或空白会使生活比必要的困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接