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

Sea*_*ard 5 sql database null

下列

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.

为什么会这样?

Joh*_*ohn 7

这两种IF说法都不对. NULL既不等于某事也不等于某事.什么IS NULL或者IS NOT NULL.


Lou*_*Bao 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'
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)