2013-05-16 75 views
5

以下为什么1 = NULL和1!= 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 

也返回乙

为什么会出现这种情况?

+3

你不能等于'没有'。 – sircodesalot

+1

'NULL'永远不会等于,不等于,大于或小于任何值。 –

+0

真的吗?它不可能不相等? –

回答

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的SELECT 语句将返回 在column_name中具有空值的行。使用WHERE的SELECT语句 column_name <> NULL返回 列中具有非空值的行。此外,使用WHERE列名称的SELECT语句<> XYZ_value返回非XYZ_value且不是 NULL的所有行。

这就是ansi_nulls off解释。但是,不要被诱惑简单地将其关闭,这是因为:

在SQL Server的未来版本中,ANSI_NULLS将永远是和 明确将该选项设置为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' 
7

IF这两个陈述都没有错。 NULL既不等于某物,也不等于某物。东西IS NULLIS NOT NULL

0

我猜NULL被指定,它在某种程度上不可与<,>,=,!=运算符无法比较。这种比较可能返回NULL。然后跳过if(NULL)处理。

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

1

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

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

因此,在这两种情况下,你在ELSE分支结束。

尝试使用this链接获取更多解释。

+1

从您的链接_...所有比较空值评估为UNKNOWN_将编辑您的响应更正。 –

+0

@ShannonSeverance听起来好多了。您无法查询SELECT 1 = NULL - 解析失败。我会记住你的评论。 –

+0

词汇很混乱。 PL/SQL有一个布尔数据类型。布尔值可以取三个值:'true','false'和'null'。 –

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行为的一个极好的职位和NULL一般混乱的性质由伊茨克奔甘

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

谓词可以评估为TRUE,FALSE或未知。谓词在涉及空值时评估为UNKNOWN。

在这里被厄兰Sommarskog希望为它:

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

SQL:1999定义了经营者分别有别于和IS NOT不同于其是相同<>和=,除了它们也适用于NULL值。

(从厄兰)这里是MVP史蒂夫卡斯请求功能上连接的链接:

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

这是一个共同的要求,但编码这个对于很多列既繁琐并容易出错(特别是由于AND/OR优先级问题)。更改ANSI_NULLS的设置不是解决方案,因为它不影响列与列之间的比较,只影响列与变量之间的比较。将ANSI_NULLS设置为关闭也是非标准的,并且不足以应用于单个查询中的特定比较。

相关问题