案例语法之间的结果差异

Ale*_*lex 3 sql-server sql-server-2016

我一直在玩 CASE 语法,并注意到以下我不完全理解的行为差异。

鉴于以下查询

DECLARE @Value1 INT 

SELECT 
    'Col1' = CASE WHEN @Value1 IS NULL THEN 'Yay'
    ELSE 'Oh'
    END
    ,'Col2' = CASE @Value1 WHEN NULL THEN 'Yay'
    ELSE 'Oh'
    END
    ,'Val' = @Value1
Run Code Online (Sandbox Code Playgroud)

我得到的结果集是这样的:

列 1 | Col2 | 瓦尔

耶 | 哦| 空值

我原以为他们会返回相同的结果。有人会很乐意解释这里发生了什么吗?

tpe*_*pet 6

出于同样的原因,我在下面添加的 Col3 返回“哦”。在您的 Col2 中,您正在测试 NULL 是否等于 @Value1。NULL 是未定义的,它不等于任何东西。正如科德所说

规则 3:系统处理空值:

DBMS 必须允许每个字段保持为空(或为空)。具体来说,它必须支持系统的、不同于所有常规值(例如,在数值的情况下,“不同于零或任何其他数字”)并且独立于数据的“缺失信息和不适用信息”的表示类型。这还暗示 DBMS 必须以系统的方式处理此类表示。

DECLARE @Value1 INT 

SELECT 
    'Col1' = CASE WHEN @Value1 IS NULL THEN 'Yay'
    ELSE 'Oh'
    END
    ,'Col2' = CASE @Value1 WHEN NULL THEN 'Yay'
    ELSE 'Oh'
    END
    ,'Col3' = CASE WHEN NULL = NULL  THEN 'Yay'
    ELSE 'Oh'
    END
    ,'Val' = @Value1
Run Code Online (Sandbox Code Playgroud)