9

在 NAME 表中,第一列为空,但未选择任何行。请帮我理解。

SELECT * FROM NAME WHERE FIRST != '1'
4

5 回答 5

16

与 的任何比较null都是错误的 -=<>, >, <, 等等。您也不能nullIN列表中使用 - 它会被忽略。此外,两个nulls甚至相等。

要获取空值,您需要明确要求它们,如下所示:

SELECT * FROM NAME WHERE FIRST IS NULL OR FIRST != '1'
于 2013-02-21T03:35:54.317 回答
10

任何与 NULL 的比较都会返回 NULL,这相当于 FALSE。这是真正的不等于前夕。

如果要包含 NULL 值,请执行以下操作之一:

where first <> '1' or first is null

或者

where coalesce(first, '<null>') <> '1'
于 2013-02-21T03:35:02.413 回答
4

在 Oracle 中,除非您明确要求,否则 null 不被视为合法值:

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

您还可以使用 NVL(类似于 coalesce):

select * from name where nvl(first,'0') != '1'
于 2013-02-21T03:35:12.800 回答
3

这是正确的,因为 NULL 永远无法与其他任何东西进行比较......

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

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

根据 Oracle 文档,NULL 被定义为一个未知的值或当该值没有意义时。这仅仅是 Oracle 提到不将零值视为 NULL 的原因。这只是一个仅供参考,一个插件。谢谢!

于 2013-02-21T03:41:29.617 回答
1

NULL 是愚蠢的。时期。

NULL 是邪恶的。

如果 X 为 NULL 而 Y 为 NULL,那么 X 实际上等于 Y,因为它们都是 NULL。

也是不能说的PITA

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

因为这种情况发生了。但现在我不得不说

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

如果我忘记括号,这是浪费时间和出错的风险。

更让我恼火的是,NULL 一开始就不应该发生。字段(呃……好吧,孩子们,我称它们为列)应该始终被初始化。时期。停止空值。不允许他们。默认值应始终为零或空白,以便那些懒得在他们的软件中初始化列的人会自动为它们初始化它们。

在许多情况下,未能定义零和空白的默认值会使生活变得更加困难。

于 2020-04-10T14:39:34.313 回答