NULLIF (Transact-SQL)

適用于: Microsoft Fabric 中 Microsoft Fabric 倉儲中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) SQL 分析端點

如果兩個指定的運算式相等,便傳回 Null 值。 例如,SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; 會針對第一個資料行 (4 和 4) 傳回 NULL,因為這兩個輸入值一樣。 第二個資料行會傳回第一個值 (5),因為這兩個輸入值不同。

Transact-SQL 語法慣例

語法

NULLIF ( expression , expression )  

引數

expression
這是任何有效的純量運算式

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

傳回型別

傳回與第一個 expression 相同的類型。

如果這兩個運算式不相等,NULLIF 會傳回第一個 expression。 如果運算式相等,NULLIF 會傳回第一個 expression 類型的 Null 值。

備註

NULLIF 相當於兩個運算式相等且產生的運算式為 NULL 的搜尋 CASE 運算式。

我們建議您不要在 NULLIF 函數中使用時間相依函數,例如 RAND()。 這可能會導致系統評估此函數兩次,並從這兩個引動過程傳回不同的結果。

範例

A. 傳回尚未變更的預算數量

下列範例會建立一份 budgets 資料表,來顯示部門 (dept) 及其目前預算 (current_year) 和前一年的預算 (previous_year)。 對今年而言,如果部門預算與前一年相同,就使用 NULL,如果預算仍未確定,就使用 0。 若只要知道收到預算之部門的平均值,且要併入前一年的預算值 (使用 previous_year 值,其中 current_yearNULL),便將 NULLIFCOALESCE 函數組合起來。

CREATE TABLE dbo.budgets  
(  
   dept            TINYINT   IDENTITY,  
   current_year    DECIMAL   NULL,  
   previous_year   DECIMAL   NULL  
);  
INSERT budgets VALUES(100000, 150000);  
INSERT budgets VALUES(NULL, 300000);  
INSERT budgets VALUES(0, 100000);  
INSERT budgets VALUES(NULL, 150000);  
INSERT budgets VALUES(300000, 250000);  
GO    
SET NOCOUNT OFF;  
SELECT AVG(NULLIF(COALESCE(current_year,  
   previous_year), 0.00)) AS [Average Budget]  
FROM budgets;  
GO  

以下為結果集。

Average Budget  
--------------  
212500.000000  
(1 row(s) affected)

B. 比較 NULLIF 和 CASE

下列查詢會評估 NULLIFCASE 資料行中的值是否相同,以顯示 MakeFlagFinishedGoodsFlag 之間的相似度。 第一個查詢使用 NULLIF。 第二個查詢則使用 CASE 運算式。

USE AdventureWorks2022;  
GO  
SELECT ProductID, MakeFlag, FinishedGoodsFlag,   
   NULLIF(MakeFlag,FinishedGoodsFlag) AS [Null if Equal]  
FROM Production.Product  
WHERE ProductID < 10;  
GO  
  
SELECT ProductID, MakeFlag, FinishedGoodsFlag, [Null if Equal] =  
   CASE  
       WHEN MakeFlag = FinishedGoodsFlag THEN NULL  
       ELSE MakeFlag  
   END  
FROM Production.Product  
WHERE ProductID < 10;  
GO  

C:傳回未包含資料的預算金額

下列範例會建立 budgets 資料表、載入資料,然後使用 NULLIF 傳回 null (如果 current_year是 null 或包含與 previous_year 相同的資料)。


Copy
CREATE TABLE budgets (  
   dept           TINYINT,  
   current_year   DECIMAL(10,2),  
   previous_year  DECIMAL(10,2)  
);  
  
INSERT INTO budgets VALUES(1, 100000, 150000);  
INSERT INTO budgets VALUES(2, NULL, 300000);  
INSERT INTO budgets VALUES(3, 0, 100000);  
INSERT INTO budgets VALUES(4, NULL, 150000);  
INSERT INTO budgets VALUES(5, 300000, 300000);  
  
SELECT dept, NULLIF(current_year,  
   previous_year) AS LastBudget  
FROM budgets;  

以下為結果集。

dept   LastBudget  
----   -----------  
1      100000.00  
2      null 
3      0.00  
4      null  
5      null

另請參閱

CASE (Transact-SQL)
decimal 和 numeric (Transact-SQL)
系統函數 (Transact-SQL)