以下
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
为什么会这样?
答案 0 :(得分:7)
IF
陈述均不属实。 NULL
既不等于某事也不等于某事。某事IS NULL
或IS 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的链接请求该功能:
这是一个常见的要求,但是对于许多列进行编码既繁琐且容易出错(特别是因为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。
答案 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)
处理。