为啥 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 中任何比较的可能结果是TRUE
、FALSE
和UNKNOWN
(mysql 将UNKNOWN
和NULL
视为同义词。并非所有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,这是为啥。
为啥我不能将url中的参数直接传递给我在MVC中的方法(参数始终为null)