NULLIF (Transact-SQL)
適用於:MICROSOFT網狀架構倉儲中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) SQL 分析端點,Microsoft Fabric SQL 資料庫中的網狀架構倉儲Microsoft網狀架構
如果兩個指定的運算式相等,便傳回 Null 值。 例如,SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different;
會針對第一個資料行 (4 和 4) 傳回 NULL,因為這兩個輸入值一樣。 第二個資料行會傳回第一個值 (5),因為這兩個輸入值不同。
語法
NULLIF ( expression , expression )
引數
expression
這是任何有效的純量運算式。
傳回型別
傳回與第一個 expression 相同的類型。
如果這兩個運算式不相等,NULLIF 會傳回第一個 expression。 如果運算式相等,NULLIF 會傳回第一個 expression 類型的 Null 值。
備註
NULLIF 相當於兩個運算式相等且產生的運算式為 NULL 的搜尋 CASE 運算式。
我們建議您不要在 NULLIF 函數中使用時間相依函數,例如 RAND()。 這可能會導致系統評估此函數兩次,並從這兩個引動過程傳回不同的結果。
範例
A. 傳回尚未變更的預算數量
下列範例會建立一份 budgets
資料表,來顯示部門 (dept
) 及其目前預算 (current_year
) 和前一年的預算 (previous_year
)。 對今年而言,如果部門預算與前一年相同,就使用 NULL
,如果預算仍未確定,就使用 0
。 若只要知道收到預算之部門的平均值,且要併入前一年的預算值 (使用 previous_year
值,其中 current_year
是 NULL
),便將 NULLIF
和 COALESCE
函數組合起來。
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
下列查詢會評估 NULLIF
和 CASE
資料行中的值是否相同,以顯示 MakeFlag
和 FinishedGoodsFlag
之間的相似度。 第一個查詢使用 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)