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