关于sql server case when ..else ..end结果类型的小议

本文通过具体测试案例,展示了SQL Server中CASE表达式的不同类型结果及其在不同版本间的差异表现,探讨了CASE表达式结果类型的确定规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个问题源于csdn一贴子,后来发现sql server各版本对这个case when else end结果的处理不尽相同。。

CASE语法如下:

/*
CASE input_expression
     WHEN when_expression THEN result_expression
    [  n ]
     [
    ELSE else_result_expression
     ]
END
Searched CASE function:
CASE
     WHEN Boolean_expression THEN result_expression
    [  n ]
     [
    ELSE else_result_expression
     ]
END
*/


联机文档有文:结果类型:从 result_expressions 和可选 else_result_expression 的类型集中返回优先级最高的类型。
有关详细信息,请参阅 数据类型优先级,如下

/*
 SQL Server uses the following precedence order for data types:
   1. user-defined data types (highest)
   2. sql_varian t
   3. xml
   4. datetimeoffset
   5. datetime2
   6. datetime
   7. smalldatetime
   8. date
   9. time
  10. float
  11. real
  12. decimal
  13. money
  14. smallmoney
  15. bigint
  16. int
  17. smallint
  18. tinyint
  19. bit
  20. ntext
  21. text
  22. image
  23. timestamp
  24. uniqueidentifier
  25. nvarchar (including nvarchar(max) )
  26. nchar
  27. varchar (including varchar(max) )
  28. char
  29. varbinary (including varbinary(max) )
  30. binary (lowest)
*/


下面准备测试数据及开始测试:


declare   @T   Table  (id  char ( 10 ))
insert   into   @T   select   ' 1 '
insert   into   @T   select   ' 2 '
insert   into   @T   select   ' 3 '

-- 显示指定结果为char类型,长度为10,可以看到case后的result类型为char,没有变化。
select   case  id  when   ' 3 ' Then   cast ( ''   as   char ( 10 ))  else  id  end   as  Id,
SQL_VARIANT_PROPERTY((
case  id  when   ' 3 ' Then   cast ( ''   as   char ( 10 ))  else  id  end ), ' BaseType ' as  CaseResultType,
case  id  when   ' 3 ' Then   DataLength ( cast ( ''   as   char ( 10 )))  else   DataLength (ID)  end   as  IDDataLength
from   @T
/*
Id    CaseResultType    IDDataLength
1             char    10
2             char    10
              char    10
*/


-- 不显示指定类型,那么''则为varchar型,根据联机文档case的result类型优先级varchar优先char,
--
可以看到case后的result类型为varchar。
select   case  id  when   ' 3 ' Then   ''   else  id  end   as  Id,
SQL_VARIANT_PROPERTY((
case  id  when   ' 3 ' Then   ''   else  id  end ), ' BaseType ' as  CaseResultType,
case  id  when   ' 3 ' Then   DataLength ( '' else   DataLength (ID)  end   as  IDDataLength
from   @T
/*
Id    CaseResultType    IDDataLength
1             varchar    10
2             varchar    10
 
             varchar    0
*/


-- 不显示指定类型,那么4则为int型,根据联机文档case的result类型优先级int优先char,
--
可以看到case后的result类型为int型,但存储大小不全是4。
select   case  id  when   ' 3 ' Then   4   else  id  end   as  Id,
SQL_VARIANT_PROPERTY((
case  id  when   ' 3 ' Then   4   else  id  end ), ' BaseType ' as  CaseResultType,
case  id  when   ' 3 ' Then   DataLength ( 4 else   DataLength (ID)  end   as  IDDataLength
from   @T
/*
Id    CaseResultType    IDDataLength
1    int                10
2    int                10
4    int                4
*/


我以上的测试环境是
Microsoft SQL Server
2008 (SP1) - 10.0 . 2531.0 (Intel X86) Mar 29 2009 10 : 27 : 29 Copyright (c) 1988 - 2008
Microsoft Corporation Standard Edition
on Windows NT 5.2 < X86 > (Build 3790 : Service Pack 2 )

目前发现在不同的版本上,包括小版本号不同,结果均有可能出现不同,不知道这些不符合联机文档描述的版本,是否可以称之为Bug ?
有兴趣的朋友可以测试贴一下你的sql版本的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值