SQL Server - 奇怪的CASE行为 - 简单案例与搜索案例

时间:2016-05-14 11:33:56

标签: sql-server case

我最近在SQL Server中使用CASE-THEN-ELSE语句(2014,如果重要)遇到了这个问题,更准确,“简单”与“搜索” CASE表达式。到现在为止,我认为这两者之间的唯一区别仅在于编写案例表达方式的格式和/或习惯,但我想我完全错了:)

MSDN Link

  

CASE表达式有两种格式:

     

简单的CASE表达式   将表达式与一组简单表达式进行比较以确定   结果。

     

搜索到的CASE表达式计算一组布尔值   表达式来确定结果。

以下是示例:

set nocount on
declare @test nvarchar(50) = null

select 
    @test as [The NULL Value], 
    case 
       when @test is null 
          then null 
          else 'Not Null???' 
    end as [As Expected],
    case @test 
       when null 
          then null 
          else 'Not Null???' 
    end as [The Pickle] 

结果是:

The NULL Value                                     As Expected The Pickle
-------------------------------------------------- ----------- -----------
NULL                                               NULL        Not Null???

有人可以提供指向MSDN文档的链接,可能会以更详细的方式解释吗? :)

P.S。:我打赌你们很多人都确信两种结果都能产生相同的输出:D

3 个答案:

答案 0 :(得分:2)

这根本不奇怪......

的“捷径”方式
 case @test 
       when null 
          then null 
          else 'Not Null???' 
    end as [The Pickle] 

使用正则相等运算符对@test子句(WHEN)中的值计算变量/列(此处为when null),并使用以下内容比较NULL标准相等运算符(@test = null始终未定义/ NULL本身(标准SQL行为),因此 true

因此,您的专栏Not Null???

会收到此结果 - The Pickle

如果您想查看NULL必须使用IS NULL,就像您的第一个例子一样......

答案 1 :(得分:0)

declare @t int =1

--simple case
select 
case @t 
when 1 then 1 else null end

以上查询扩展为以下形式..

select 
case when @t=1 then 1 else null end

所以带null的查询将扩展到

以下
declare @t int=null
select case @t
when null then null else 'notnull' end

扩展为

select case when @t=null then null else 'notnull' end 

显然评估为不为空..

所以总结一下,只有在null的情况下,你不会得到你期望的结果,请尝试下面看

declare @t int=null
declare @t1 int =1

select 
case when @t is null then null else 'notnull' end as 'Searchedcase',
case @t when null then null else 'notnull' end as'simple case',
case when @t1 =1 then 1 else  null end as 'Searchedcase for value',
case @t1 when 1 then 1 else null end as'simple case for value'

答案 2 :(得分:0)

  1. 请参阅Transact-SQL参考中对NULL and UNKNOWN的讨论,以了解为什么'='不适用于NULL。
  2. 简单CASE必须隐式使用'=',而不是IS NULL。因此,要使IS NULL显式,请使用Searched CASE表达式。
  3. 也许Microsoft会在简单的CASE表达式中添加一些功能,如果遇到NULL,那么会使用运算符'IS'吗?