Sql-Server
在檢查欄位是否為整數時將 nullif 與 case 語句相結合
作為 ETL 過程的一部分,我需要將 table1(臨時表)中的 varchar 欄位複製到 table2(生產表)中的 tinyint 欄位中,該欄位包含一個整數值。但是,在嘗試結合以下兩個業務需求時,我遇到了一些問題:
- 如果源 varchar 欄位的值為空,那麼它將在目標 tinyint 欄位中設置為 NULL。為此,我通常會使用 NULLIF。
- 如果該欄位包含無法轉換為 tinyint 值的任何內容(例如標點符號、字母或高於 255 的值),則該值將在目標 tinyint 欄位中設置為 255。這背後的基本原理是,除非出現錯誤,否則 tinyint 欄位永遠不會有 255 值 - 將錯誤設置為 NULL 或 0 是不合適的,因為這些是完全有效的值,我們將無法區分有效輸入和錯誤輸入。
我遇到的問題是嘗試將 NULLIF 與某種 case 語句結合起來。我認為這也許不是正確的做法。對此有什麼想法嗎?
我相信 Azure 支持TRY_CAST。
(如果轉換成功,則返回一個轉換為指定數據類型的值;否則,返回 null。)
以下三個範例似乎可以證明您所追求的:
--Column is blank, then NULL DECLARE @YourCol1 VARCHAR(10) = ' ' SELECT CASE WHEN @YourCol1 = ' ' THEN NULL ELSE ISNULL(TRY_CAST(@YourCol1 AS TINYINT), 255) END AS YourCol1 --Column won't successfully CAST to TinyInt, then 255 DECLARE @YourCol2 VARCHAR(10) = 'abc' SELECT CASE WHEN @YourCol2 = ' ' THEN NULL ELSE ISNULL(TRY_CAST(@YourCol2 AS TINYINT), 255) END AS YourCol2 --Column successfully CASTS to TinyInt, then actual value DECLARE @YourCol3 VARCHAR(10) = '21' SELECT CASE WHEN @YourCol3 = ' ' THEN NULL ELSE ISNULL(TRY_CAST(@YourCol3 AS TINYINT), 255) END AS YourCol3