为什么1 = NULL和1!= NULL的结果相同?

时间:2013-05-16 21:10:16

标签: sql database null

以下

IF 1 = NULL 
    BEGIN
        SELECT  'A'
    END
ELSE 
    BEGIN
        SELECT  'B'
    END

按预期返回结果B

这里的事情非常有趣

IF 1 != NULL 
    BEGIN
        SELECT  'A'
    END
ELSE 
    BEGIN
        SELECT  'B'
    END

还返回B

为什么会这样?

6 个答案:

答案 0 :(得分:7)

IF陈述均不属实。 NULL既不等于某事也不等于某事。某事IS NULLIS NOT NULL

答案 1 :(得分:2)

它既不等于也不等于NULL,因为NULL不是的东西,但实际上是没有东西。

ANSI SQL 1999(但不是MSSQL)包含一个名为IS [NOT] DISTINCT FROM的方法,可以在NULL上使用您可能期望的结果。

How to rewrite IS DISTINCT FROM and IS NOT DISTINCT FROM?

以下是关于IS DISTINCT FROM行为的优秀帖子以及Itzik Ben-Gan一般NULL的混乱性质

http://sqlmag.com/sql-server/not-distinct

  

谓词可以评估为TRUE,FALSE或UNKNOWN。每当涉及NULL时,谓词的计算结果为UNKNOWN。

这是Erland Sommarskog希望的:

http://www.sommarskog.se/wishlist.html#isdistinctfrom

  

SQL:1999定义运算符IS DISTINCT FROM和IS NOT DISTINCT FROM与<>相同和=分别,除了它们也适用于NULL值。

(来自Erland)这是一个关于Connect for MVP Steve Kass的链接请求该功能:

http://connect.microsoft.com/SQLServer/feedback/details/286422/add-language-and-optimizer-support-for-iso-distinct-predicate

  

这是一个常见的要求,但是对于许多列进行编码既繁琐且容易出错(特别是因为AND / OR优先级问题)。更改ANSI_NULLS的设置不是解决方案,因为它不会影响列到列的比较,只会影响列到变量的比较。将ANSI_NULLS设置为off也是非标准的,并且不够精细,无法应用于单个查询中的特定比较。

答案 2 :(得分:2)

同意其他人已经说过的话。只需从另一个角度评论,如果您尝试将ansi_nulls设置为关闭,您可能会得到您的预期:

set ansi_nulls off

if 1 = null
    select 'a'
else
    select 'b' -- Returned


if 1 != null
    select 'a' -- Returned
else
    select 'b'

联机丛书的更多信息:

  

当SET ANSI_NULLS为OFF时,等于(=)和不等于(<>)   比较运算符不符合ISO标准。一个选择   使用WHERE column_name = NULL的语句返回的行   在column_name中具有空值。使用WHERE的SELECT语句   column_name<> NULL返回具有非空值的行   柱。此外,使用WHERE column_name<>的SELECT语句   XYZ_value返回非XYZ_value且不是XYZ_value的所有行   NULL。

那是ansi_nulls off解释的。但是,不要试图简单地关闭它,因为:

  

在SQL Server的未来版本中,ANSI_NULLS将始终为ON和   任何明确将选项设置为OFF的应用程序都将生成   一个错误。避免在新的开发工作和计划​​中使用此功能   修改当前使用此功能的应用程序。

请遵循以下建议:

  

使脚本按预期工作,无论ANSI_NULLS如何   数据库选项或SET ANSI_NULLS的设置,使用IS NULL和IS   在可能包含空值的比较中为NOT NULL。

if 1 is null
    select 'a'
else
    select 'b' -- Returned


if 1 is not null
    select 'a' -- Returned
else
    select 'b'

答案 3 :(得分:1)

您无法比较NULL = NULL - 它没有价值。

SELECT 1 
WHERE NULL = NULL

不返回任何内容

比较NULL值使用IS而不是=

SELECT 1
WHERE NULL IS NULL

Reuturns 1

来自MSDN:

  

要确定表达式是否为NULL,请使用IS NULL或IS NOT NULL   而不是比较运算符(例如=或!=)。对照   如果其中一个或两个参数都为NULL,则运算符返回UNKNOWN。

http://msdn.microsoft.com/en-us/library/aa933227

答案 4 :(得分:1)

这很简单。在ANSI术语中,涉及NULL的任何表达式(逻辑或算术)都有未知结果:

(1 = NULL) IS UNKNOWN
(1 <> NULL) IS UNKNOWN
(1 + NULL) IS UNKNOWN
(1 * NULL) IS UNKNOWN

因此,在这两种情况下,您最终都会进入ELSE分支。

请尝试使用this链接获取更多说明。

答案 5 :(得分:0)

我认为NULL被指定为某种方式,它与&lt;,&gt;,=,!=运算符无法比较。这种比较可能返回NULL。然后跳过if(NULL)处理。

相关问题