[SQL]資料類型優先順序( Data Type Precedence )

在Case When 給了 1=1 後,明明它會執行Convert成varchar的SQL,為何回傳不是CONVERT後的VARCHAR,而是Datetime呢?

今天同事問一個問題,覺得蠻有趣的,所以就記錄下來。

問題是在Case When 給了 1=1 後,明明它會執行Convert成varchar的SQL,為何回傳不是CONVERT後的VARCHAR,而是Datetime呢? 如下,

SELECT CASE WHEN 1=1 
	THEN 
		CONVERT(varchar ,GETDATE(),112) 
	ELSE 
		 CMP_ENT_DTE --datetime
	END 
	,CONVERT(varchar ,GETDATE(),112) 
FROM EMP_EMPLOYEE
WHERE PER_SERIL_NO='911101'

image

看了執行計畫,輸出值在做好了CONVERT(varchar ,GETDATE(),112)後,又被專換成datetime型態了! 如下,

image

 

後來同事找到了「資料類型優先順序」,發現datetime的順序在varchar的前面,所以輸出就會使用datetime的資料型態輸出!

所以,如果將原本的varchar改成date,輸出型態也會是datetime。因為datetime的順序也是在date之前,如下,

image

image

 

那如果改成datetimeoffset,輸出資料型態,也就會變成了datetimeoffset了哦!因為datetimeoffset的順序也是在datetime之前,如下,

image

image

 

當然,大多數的人應該會先取出值之後,再進行Convert吧! 如下,

image

感謝同事 天使姐姐 的討論與分享!

 

參考資料

資料類型優先順序

Use caution when Using CONVERT() with CASE or IF functions in Transact SQL (T-SQL)

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^