这显然不会回归......
select 1 where null = ''
但为什么这也不会返回一行?
select 1 where null <> ''
这两个人怎么会“假”?
答案 0 :(得分:5)
“这两个人如何”虚假“?”
不是! 答案也不是“真实的”! 答案是“我们不知道”。
将NULL
视为您尚不知道的值。
你敢打赌它是''
吗?
你敢打赌它不是''
吗?
所以,更安全的是声明你还不知道。因此,这两个问题的答案都不是假的,但我不知道,例如SQL中的NULL
。
答案 1 :(得分:3)
因为这是符合ANSI SQL的SQL Server实例; - )
SQL中的 NULL
在比较规则中与IEEE NaN有些相似:NaN != NaN
和NaN == NaN
都是假的。它需要SQL中的特殊运算符IS NULL
(或IEEE FP的"IsNaN"
)来检测这些特殊值。 (实际上有多种方法可以检测这些特殊值:IS NULL/"IsNaN"
只是简洁明了的方法。)
但是,NULL = x
更进了一步: NULL =/<> x
的结果不是假的。相反,表达式的结果是本身 UNKNOWN。所以NULL
NOT(NULL = '')
也是 UNKNOWN(或在上下文中为“false” - 请参阅注释)。欢迎来到SQL的世界tri-state logic; - )NULL
由于问题与SQL Server有关,那么为了完整性:如果运行"SET ANSI_NULLS OFF"运行 - 但在顶部看到备注/警告 - 则可以达到“原始”TSQL行为。
“原始”行为(已弃用):
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
快乐的编码。
答案 2 :(得分:2)
Null在比较时有一些非常奇怪的行为 - wikipedia article explains it quite well。简而言之,除了true和false之外,还有一个未知值,SQL在进行比较时返回。
答案 3 :(得分:1)
SQL标准指定NULL = x
对所有x
都是false(即使x
本身是NULL
),而SQL Server只是遵循标准。如果您想检查某些内容是否为NULL
,则必须使用x IS NULL
或x IS NOT NULL
。
答案 4 :(得分:1)
数据库具有所谓的三值逻辑。 true,false和unknown的值。
阅读此http://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued-logic/
答案 5 :(得分:0)
因为与NULL的任何比较都返回false(或者确切地说:返回NULL)
由于NULL是缺少信息,因此无法判断是否等于某事。
答案 6 :(得分:0)
可能在这里重复一点,但我的两分钱:
一个。 a_horse_with_no_name的例子(上面的评论)非常好!
B中。在非=数学术语中,NULL是未知值。空String是一个长度为零的字符串 - 因此是一个“已知”值。这就是为什么NULL不能与空字符串进行相同或不同的比较。
℃。由于NULL表示未知,因此无法比较两个NULL值是否相等。如果您不知道X的值,并且您不知道Y的值,那么您不知道它们是否相等。