在SQL Server中,为什么NULL不等于空字符串并且不等于空字符串?

时间:2011-03-28 21:23:05

标签: sql sql-server sql-server-2008

这显然不会回归......

select 1 where null = ''

但为什么这也不会返回一行?

select 1 where null <> ''

这两个人怎么会“假”?

7 个答案:

答案 0 :(得分:5)

这两个人如何”虚假“?

不是! 答案也不是“真实的”! 答案是“我们不知道”。

NULL视为您尚不知道的值。

你敢打赌它是''吗?

你敢打赌它不是''吗?

所以,更安全的是声明你还不知道。因此,这两个问题的答案都不是假的,但我不知道,例如SQL中的NULL

答案 1 :(得分:3)

因为这是符合ANSI SQL的SQL Server实例; - )

SQL中的

NULL在比较规则中与IEEE NaN有些相似:NaN != NaNNaN == NaN都是假的。它需要SQL中的特殊运算符IS NULL(或IEEE FP的"IsNaN")来检测这些特殊值。 (实际上有多种方法可以检测这些特殊值:IS NULL/"IsNaN"只是简洁明了的方法。)

但是,NULL = x更进了一步: NULL =/<> x的结果不是假的。相反,表达式的结果是本身NULL UNKNOWN。所以NOT(NULL = '') 也是NULL UNKNOWN(或在上下文中为“false” - 请参阅注释)。欢迎来到SQL的世界tri-state logic; - )

由于问题与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 NULLx 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的值,那么您不知道它们是否相等。