關於sql server case when ..else ..end結果類型的小議

來源:互聯網
上載者:User
這個問題源於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版本的結果。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.