Sql-Server

在檢查欄位是否為整數時將 nullif 與 case 語句相結合

  • November 24, 2016

作為 ETL 過程的一部分,我需要將 table1(臨時表)中的 varchar 欄位複製到 table2(生產表)中的 tinyint 欄位中,該欄位包含一個整數值。但是,在嘗試結合以下兩個業務需求時,我遇到了一些問題:

  1. 如果源 varchar 欄位的值為空,那麼它將在目標 tinyint 欄位中設置為 NULL。為此,我通常會使用 NULLIF。
  2. 如果該欄位包含無法轉換為 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

引用自:https://dba.stackexchange.com/questions/156268