關於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 Server CASE WHEN ... THEN ... ELSE ... ENDSQLServer
- SQL中的case when then else end用法 【詳細】轉載SQL
- sql case when, Exist ,group by ,聚合SQL
- Oracle case when改寫SQLOracleSQL
- SQL語句case when外用sum與count的區別SQL
- case when 語句
- mysql中case when的使用MySql
- Sql Server關於indexed view索引檢視的總結SQLServerIndexView索引
- 關於Sql server資料型別HierarchyID 資料型別用法和遞迴顯示完整路徑SQLServer資料型別遞迴
- SQL Server-資料型別SQLServer資料型別
- SQLServer使用case when中的order bySQLServer
- SQL Server日期資料型別DATE的使用SQLServer資料型別
- struts 結果型別型別
- 關於結構體型別的學習結構體型別
- 【Case】SQL SERVER 屬性OWNER不可用於資料庫xxx。SQLServer資料庫
- springboot jap自定義原生sql 接收SELECT count(*) 的返回long型別結果Spring BootSQL型別
- 在CSS中如何使用 when/elseCSS
- sql server 資料型別轉換函式SQLServer資料型別函式
- 關於SQL Server索引的最左匹配原則SQLServer索引
- 關於SQL Server配置管理器SQLServer
- mysql關於mysql.server的總結MySqlServer
- SQL SERVER與C#的資料型別對應表SQLServerC#資料型別
- SQL Server 別名(as)SQLServer
- 關於SQL優化的小知識SQL優化
- 消除程式碼中的 if-else/switch-case
- Oracle vs PostgreSQL Develop(30) - Index&Case whenOracleSQLdevIndex
- 【SQL】18 SQL NULL 函式、SQL 通用資料型別、SQL 用於各種資料庫的資料型別SQLNull函式資料型別資料庫
- T-SQL——關於表型別SQL型別
- SQL Server 2016關係型資料庫概覽AZSQLServer資料庫
- 關於SQL Server 映象資料庫快照的建立及使用SQLServer資料庫
- SQL Server 遷移至MySQL 關鍵步驟的梳理總結ServerMySql
- SQL SERVER 日期和時間資料型別及函式 (Transact-SQL)SQLServer資料型別函式
- 如何優化程式碼中大量的if/else,switch/case?優化
- Linux系統下的SQL Server不支援其他型別資料來源的連結伺服器LinuxSQLServer型別伺服器
- 關於 Go 中 Map 型別和 Slice 型別的傳遞Go型別
- SQL Server 索引結構SQLServer索引
- SQL與NoSQL(關係型與非關係型)資料庫的區別SQL資料庫
- SQL Server 資料庫部分常用語句小結(二)SQLServer資料庫
- SQL Server 資料庫部分常用語句小結(一)SQLServer資料庫