[英]Why in SQL NULL can't match with NULL?
我是 SQL 概念的新手,在研究 NULL 表达式时我想知道为什么 NULL 不能与 NULL 匹配 谁能告诉我一个真实世界的例子来简化这个概念?
规则:即使NULL也不能等于NULL。
非技术方面
如果你问两个女孩,他们多大了? 也许你会听到他们拒绝回答你的问题,这两个女孩都给你年龄的NULL,这并不意味着两者都有相似的年龄。 所以没有什么可以等于null。
NULL
表示缺少值。 SQL的设计者认为,当被问及A
(我们不知道它的价值)和B
(我们不知道它的价值)是否相等时,它是有意义的,答案必须是UNKNOWN
- 它们可能是相同的,他们可能不会。 我们没有足够的信息来决定这两种方式。
您可能想要阅读三值逻辑 - SQL中任何比较的可能结果都是TRUE
, FALSE
和UNKNOWN
(mysql将UNKNOWN
和NULL
视为同义词。并非所有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
在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 ISNULL
, https://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.