关于sql server case when ..else ..end结果类型的小议
Posted on 2009-10-15 14:07 nzperfect 阅读(4592) 评论(8) 编辑 收藏 举报这个问题源于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
*/
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)
*/
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版本的结果。
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版本的结果。
作者:nzperfect
出处:http://www.cnblogs.com/nzperfect/
引用或者转载本BLOG的文章请注明原作者和出处,并保留原文章中的版权信息。