關於sql server case when ..else ..end結果型別的小議
這個問題源於csdn一貼子,後來發現sql server各版本對這個case when else
end結果的處理不盡相同。。
CASE語法如下:
聯機文件有文:結果型別:從 result_expressions 和可選 else_result_expression 的型別集中返回優先順序最高的型別。
有關詳細資訊,請參閱 資料型別優先順序,如下
下面準備測試資料及開始測試:
CASE語法如下:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->/*
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
*/
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->/*
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 的型別集中返回優先順序最高的型別。
有關詳細資訊,請參閱 資料型別優先順序,如下
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->/*
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)
*/
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->/*
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)
*/
下面準備測試資料及開始測試:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
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
*/
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
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版本的結果。
檢視原文:http://www.cnblogs.com/nzperfect/archive/2009/10/15/1583843.html
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版本的結果。
檢視原文:http://www.cnblogs.com/nzperfect/archive/2009/10/15/1583843.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616629/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL中的case when then else end用法SQL
- SQL中的case when then else end用法 【詳細】轉載SQL
- oracle plsql case when_end case小記OracleSQL
- plsql_case when_end case學習小例SQL
- sql中case when的小學SQL
- sql server select case when的用法SQLServer
- sqlserver與oracle case when else ,isnull語法差別SQLServerOracleNull
- plsql_case when_if else endifSQL
- SQL Case WhenSQL
- oracle面試題[關於case when的用法]Oracle面試題
- 136-MySQL5.17 update更新[case when then end]的使用MySql
- SQL中的CASE WHEN使用SQL
- SQL Case when 的使用方法SQL
- 關於SQL Server 中的25種資料型別SQLServer資料型別
- SQL語句case when外用sum與count的區別SQL
- Oracle case when改寫SQLOracleSQL
- PL/SQL Case when應用SQL
- sql case when, Exist ,group by ,聚合SQL
- ORACLE CASE WHEN 及 SELECT CASE WHEN的用法Oracle
- sql_case when_根據不同使用者型別統計收藏記錄數SQL型別
- 【SQL】小CASESQL
- struts 結果型別型別
- Oracle Case WhenOracle
- Oracle的order by case whenOracle
- 關於oracle中的sql資料型別OracleSQL資料型別
- ORACLE SQL開發where子句之case-whenOracleSQL
- PLSQL條件(CASE WHEN)語句小應用SQL
- mysql case when then 使用MySql
- oracle 中的 if- else if- end ifOracle
- mysql中case when的使用MySql
- mysql中的case when 與if()MySql
- sql server型別轉換SQLServer型別
- sql server sysobjects xtype型別SQLServerObject型別
- 關於結構體型別的學習結構體型別
- Sql Server關於indexed view索引檢視的總結SQLServerIndexView索引
- 關於Sql server資料型別HierarchyID 資料型別用法和遞迴顯示完整路徑SQLServer資料型別遞迴
- Case when 支援變數變數
- case when遇上null值Null