繁体   English   中英

为什么SQL中的NULL不能和NULL匹配?

[英]Why in SQL NULL can't match with NULL?

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

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

非技术方面

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

NULL表示缺少值。 SQL的设计者认为,当被问及A (我们不知道它的价值)和B (我们不知道它的价值)是否相等时,它是有意义的,答案必须是UNKNOWN - 它们可能是相同的,他们可能不会。 我们没有足够的信息来决定这两种方式。

您可能想要阅读三值逻辑 - SQL中任何比较的可能结果都是TRUEFALSEUNKNOWN (mysql将UNKNOWNNULL视为同义词。并非所有RDBMS都这样做)

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

为了更好的解释,请参阅为什么null不等于null false

NULL表示字段中没有数据。

您可以使用IS NULL检查NULL值

请参见IS NULL

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

1 row in set (0.00 sec)

如果需要进行比较,其中NULL确实等于NULL,则可以使用一对具有特殊默认值的coalesce方法。 最简单的例子是可以为空的字符串列。

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

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

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

您不能使用= for NULL而是可以使用IS NULL

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

请关注链接

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

检查我们可以使用

Is Null or Not Null operators ..

文献

如果错了,请纠正我

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

SQL中任何一方都有NULL的二进制操作的计算结果为NULL(将NULL视为未知的同义词)

所以

Select ... Where null = null

Select ... Where field = null

Select ... Where null = field

将返回没有行,因为在每种情况下,where类的计算结果为NULL,而不是TRUE

实际上NULL意味着UNKNOWN值所以我们如何比较两个UNKNOWN值。

除了使用IS NULL ,另一种在SQL Server中匹配 NULL 的方法是 function ISNULLhttps://learn.microsoft.com/en-us/sql/t-sql/functions/isnull-transact-sql

SELECT * 
FROM TABLE_A t1
INNER JOIN TABLE_B t2 ON ISNULL(t1.somecol, somevalue) = ISNULL(t2.somecol, somevalue)

其中somevalue可以是 'NULL' 或 0 或其他。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM