下列
IF 1 = NULL
BEGIN
SELECT 'A'
END
ELSE
BEGIN
SELECT 'B'
END
Run Code Online (Sandbox Code Playgroud)
按预期返回结果B.
事情变得非常有趣
IF 1 != NULL
BEGIN
SELECT 'A'
END
ELSE
BEGIN
SELECT 'B'
END
Run Code Online (Sandbox Code Playgroud)
也返回B.
为什么会这样?
同意其他人已经说过的话。简单地从另一个角度评论一下,如果你尝试设置ansi_nulls关闭,你可能会得到你所期望的结果:
set ansi_nulls off
if 1 = null
select 'a'
else
select 'b' -- Returned
if 1 != null
select 'a' -- Returned
else
select 'b'
Run Code Online (Sandbox Code Playgroud)
更多信息来自在线图书:
当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵循 ISO 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中具有空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中具有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句将返回所有非 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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
208 次 |
| 最近记录: |