首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server怪异案例,bahavior简单案例与搜索案例

Server怪异案例,bahavior简单案例与搜索案例
EN

Stack Overflow用户
提问于 2016-05-14 11:33:56
回答 3查看 1K关注 0票数 4

我最近遇到了Server中的CASE-THEN-ELSE语句(如果有关系的话,2014年),更准确地说,“简单”和“搜索”案例表达式。到目前为止,我认为这2之间的唯一区别只是格式和/或用两种方式编写案例表达式的习惯,但我想我完全错了:)

MSDN链路

CASE表达式有两种格式: 简单案例表达式将表达式与一组简单表达式进行比较,以确定结果。 搜索的案例表达式计算一组布尔表达式以确定结果。

下面是一个例子:

代码语言:javascript
复制
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] 

结果是:

代码语言:javascript
复制
The NULL Value                                     As Expected The Pickle
-------------------------------------------------- ----------- -----------
NULL                                               NULL        Not Null???

有人能提供到MSDN文档的链接吗?也许可以用更详细的方式解释这一点吗?)

P.S.:我敢打赌你们中的很多人肯定这两种结果都会产生相同的结果:D

EN

回答 3

Stack Overflow用户

发布于 2016-05-14 11:54:34

一点都不奇怪..。

的“捷径”

代码语言:javascript
复制
 case @test 
       when null 
          then null 
          else 'Not Null???' 
    end as [The Pickle] 

将变量/列(此处:@test)与WHEN子句(when null)中的值与常规相等运算符(@test = null)进行比较,使用标准等式运算符(@test = null)比较NULL总是未定义/NULL本身(标准SQL行为),因此不为 true

因此,您将得到这个结果-- Not Null??? --用于列The Pickle

如果要检查NULL,则必须使用IS NULL,如第一个示例所示.

票数 3
EN

Stack Overflow用户

发布于 2016-05-14 12:19:11

代码语言:javascript
复制
declare @t int =1

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

上面的查询扩展到下面的表单。

代码语言:javascript
复制
select 
case when @t=1 then 1 else null end

因此,带有null的查询将扩展到下面

代码语言:javascript
复制
declare @t int=null
select case @t
when null then null else 'notnull' end

被扩展到

代码语言:javascript
复制
select case when @t=null then null else 'notnull' end 

它的计算值显然为null。

因此,总之,仅在null情况下,您将无法获得预期的结果,请在下面尝试查看

代码语言:javascript
复制
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'
票数 0
EN

Stack Overflow用户

发布于 2016-12-30 17:27:09

  1. 请参阅Transact-SQL引用中关于空未知的讨论,以获得'=‘不适用于NULL的句柄。
  2. 简单大小写必须隐式使用'=',而不是NULL。因此,若要使IS NULL显式,请使用已搜索的CASE表达式。
  3. 也许微软会在简单的CASE表达式中添加一些功能,如果遇到NULL,那么使用操作符“is”吗?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37226126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档