T-SQL - Case 運算式的返回型態優先順序問題

  • 389
  • 0
  • SQL
  • 2019-08-05

最近使用 Case When 判斷踩到了一個資料型態的雷,特此紀錄。

問題在此,情況大概是做完一系列 case when 的判斷後,最後有 else 給 default 值,但這個值的型態和前面條件式返回的型態不同。

出現了我給定空字串他卻給我 0 的問題。

如果是這樣就沒什麼問題。

 

查了一下 Microsoft 的 SQL 文件看到了傳回類型的說明

傳回類型

從 result_expressions 和選擇性 else_result_expression 的類型集傳回優先順序最高的類型。 

SQL Server 會使用下列資料類型優先順序:

  1. 使用者自訂資料類型 (最高)
  2. sql_variant
  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 (包含 nvarchar(max))
  26. nchar
  27. varchar (包含 varchar(max))
  28. char
  29. varbinary (包含 varbinary(max))
  30. binary (最低)

在我的例子中,尋找全部的 result expression 後會發現最高的優先權就是 int (排第 16 名,相對於 varchar 的第 27),所以空字串會被強迫自動轉為 int 類型後回傳。

所以建議所有的返回值應該要保持同樣的資料型態,以我的例子來說,則建議使用 CONVERT 將 INT 轉為 VARCHAR 型別,這樣就可以讓 then 及 else 的返回值均為 VARCHAR 型別,以減少這類錯誤發生的機會。