为啥 SQL 中的 NULL 不能与 NULL 匹配?

Posted

技术标签:

【中文标题】为啥 SQL 中的 NULL 不能与 NULL 匹配?【英文标题】:Why in SQL NULL can't match with NULL?为什么 SQL 中的 NULL 不能与 NULL 匹配? 【发布时间】:2012-10-02 23:12:02 【问题描述】:

我是 SQL 概念的新手,在研究 NULL 表达式时,我想知道为什么 NULL 不能与 NULL 匹配,谁能告诉我一个现实世界的例子来简化这个概念?

【问题讨论】:

....is null? 是的。有趣的事情:sqlfiddle.com/#!2/d41d8/2746 :) @PraveenKumar,您可以检查某些内容是否为空。但不能比较,因为结果是未知的,比如除以零。 啊,谢谢你的解释! 更糟糕的是,"bla" != NULL 为假,即使该 NULL 来自另一列。 【参考方案1】:

规则:即使是 NULL 也不能等于 NULL。

非技术方面

如果你问两个女孩,她们几岁?也许你会听到他们拒绝回答你的问题, 两个女孩都给你 NULL 作为年龄,这并不意味着两个女孩的年龄相似。 所以没有什么可以等于null。

【讨论】:

@JoeNorman 很高兴为您提供帮助,但请考虑阅读 Damien 和其他人的答案,他们列出了技术方面。 @JoeGJoseph 谢谢老兄.. 实际上前一天我向我办公室的一位女士提出了类似的问题,她拒绝在她生日那天回答。 :P 它在我脑海中的意义:null 是一种状态......不是一个值。值不能等于存在状态。【参考方案2】:

NULL 表示值的不存在。 SQL 的设计者认为,当被问及A(我们不知道它的值)和B(我们不知道它的值)是否相等时,答案一定是@987654325 @ - 它们可能相等,也可能不相等。我们没有足够的信息来决定哪种方式。

您可能想阅读Three valued logic - SQL 中任何比较的可能结果是TRUEFALSEUNKNOWNmysqlUNKNOWNNULL 视为同义词。并非所有RDBMS做)

【讨论】:

【参考方案3】:

NULL 是一个未知值。因此判断NULL == NULL 毫无意义。这就像问“这个未知值是否等于那个未知值” - 没有线索..

请参阅why is null not equal to null false 以获得更好的解释

【讨论】:

【参考方案4】:

NULL 是字段中没有数据。

您可以使用 IS NULL 检查 NULL 值

见IS NULL

mysql> SELECT NULL IS NULL;
+--------------+
| NULL IS NULL |
+--------------+
|            1 |
+--------------+

1 row in set (0.00 sec)

【讨论】:

【参考方案5】:

如果您需要在 NULL 确实等于 NULL 的情况下进行比较,您可以使用一对带有 特殊 默认值的 coalesce 方法。最简单的示例是可空字符串列。

coalesce(MiddleName,'')=coalesce(@MiddleName,'')

如果 @MiddleName 变量具有空值并且 MiddleName 列也具有空值,则此比较返回 true。当然,它也匹配空字符串。如果这是一个问题,您可以将特殊值更改为一些愚蠢的东西,例如

coalesce(MiddleName,'<NULL_DEFAULT>')=coalesce(@MiddleName,'<NULL_DEFAULT>')

【讨论】:

【参考方案6】:

您不能将 = 用于 NULL,而可以使用 IS NULL

http://www.w3schools.com/sql/sql_null_values.asp

【讨论】:

【参考方案7】:

请关注link

与任何其他值相比,NULL 值永远不会为真,即使是 NULL

检查我们可以使用

Is Null or Not Null operators ..

Document

如果有错请指正

【讨论】:

【参考方案8】:

在 SQL 中,WHERE 子句仅在表达式的结果等于 TRUE 时才包含该值。 (这与“如果表达式的结果不为 FALSE”不同)

SQL 中任何一侧为 NULL 的二元运算都会计算为 NULL(将 NULL 视为未知的同义词)

所以

Select ... Where null = null

Select ... Where field = null

Select ... Where null = field

将不返回任何行,因为在每种情况下 where 类的计算结果都是 NULL,它不是 TRUE

【讨论】:

【参考方案9】:

其实 NULL 表示 UNKNOWN 值那么我们如何比较两个 UNKNOWN 值。

【讨论】:

以上是关于为啥 SQL 中的 NULL 不能与 NULL 匹配?的主要内容,如果未能解决你的问题,请参考以下文章

SQl2008中主键不能等于NULL,可是可以等于null,这是为啥。

Decimal类型的字段为啥不能为Null

为啥我不能将url中的参数直接传递给我在MVC中的方法(参数始终为null)

为啥SqlParameter名称/值构造函数将0视为null?

SQL 如何把现有字段设为not null

SQL中的null值