这显然不会返回一行...
(这里的“行”可能指的是数据库中的一行数据)
select 1 where null = ''
但是为什么这个查询也没有返回结果行呢?
select 1 where null <> ''
这两个WHERE条件怎么可能都是“false”呢?
这显然不会返回一行...
select 1 where null = ''
select 1 where null <> ''
NULL
看作你还不知道的值。''
吗?''
吗?NULL
。"NULL
与IEEE NaN在比较规则上有些相似:NaN!= NaN
和NaN == NaN
都是false。需要使用一个特殊的运算符IS NULL
(对于IEEE FP,“IsNaN”)来检测这些特殊值。(实际上有多种方法可以检测这些特殊值:IS NULL / "IsNaN"
只是干净而简单的方法。)NULL = x
更进一步:NULL =/<> x
的结果不是false,而是NULL
NOT(NULL = '')
也是NULL
SET ANSI_NULLS OFF;
select 'eq' where null = ''; -- no output
select 'ne' where null <> ''; -- output: ne
select 'not' where not(null = ''); -- output: not; null = '' -> False, not(False) -> True
ANSI-NULLs行为(最近的默认值,请使用):
SET ANSI_NULLS ON;
select 'eq' where null = ''; -- no output
select 'ne' where null <> ''; -- no output
select 'not' where not(null = ''); -- no output; null = '' -> Unknown, not(Unknown) -> Unknown
愉快地编程。
因为与 NULL 进行任何比较都返回 false(或者准确地说:返回 NULL)
由于 NULL 是缺乏信息的表示,你无法确定它是否等于或不等于某个值。
可能会有一点重复,但这是我的两分钱意见:
A. a_horse_with_no_name 的例子(上面的评论)非常好!
B. 以非数学术语来说,NULL 是一个未知值。空字符串是长度为零的字符串 - 因此是一个“已知”值。这就是为什么 NULL 不等于或不不等于空字符串。
C. 由于 NULL 表示未知,不可能比较两个 NULL 值是否相等。如果你不知道 X 的值,也不知道 Y 的值,那么你就不知道它们是否相等。
参见SQL-92 8.2比较谓词的说法:
一般规则
设X和Y是任意两个对应的
<row value constructor element>
。设XV和YV分别表示X和Y所代表的值。情况:
a) 如果XV或YV是空值,则“X
<comp op>
Y”是未知的。
NULL = x
的结果为UNKNOWN。在WHERE
语境中,其效果是将该行从结果集中移除。在约束上下文中,其效果是对该行的更新不会失败。 - onedaywhen