NULLIF (Transact-SQL)

如果兩個指定的運算式相等,便傳回 Null 值。

主題連結圖示Transact-SQL 語法慣例

語法

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 函數組合起來。

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.budgets','U') IS NOT NULL
   DROP TABLE budgets;
GO
SET NOCOUNT ON;
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

以下為結果集:

平均預算

--------------

212500.000000

(1 個資料列受到影響)

B. 比較 NULLIF 和 CASE

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

USE AdventureWorks;
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