NULLIF (Transact-SQL)
指定された 2 つの式が等しい場合に NULL 値を返します。
構文
NULLIF ( expression , expression )
戻り値の型
最初に指定した expression と同じデータ型を返します。
2 つの式が等しくない場合、NULLIF は最初に指定した expression を返します。2 つの式が等しい場合、NULLIF は最初に指定した expression のデータ型の NULL 値を返します。
説明
NULLIF は、2 つの式を比較し、その 2 つが等価な場合に NULL を返す検索 CASE 式と同じです。
NULLIF 関数の中では、RAND() など時間に依存する関数は使用しないことをお勧めします。関数が 2 回呼び出されて評価され、それぞれ異なる結果が返されることがあります。
例
A. 変更のない予算額を返す
次の例では、部門 (dept)、今年度予算 (current_year)、および昨年度予算 (previous_year) で構成される budgets テーブルを作成します。今年度予算が昨年度予算と変わらない部門については NULL を使用し、今年度予算がまだ決定していない場合は 0 を使用します。昨年度予算の値を使用する場合も含めて (current_year が NULL の場合は previous_year の値を使用)、今年度予算を受け取った部門についてだけその平均値を求めるには、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
以下に結果セットを示します。
Average Budget
--------------
212500.000000
(1 row(s) affected)
B. NULLIF と CASE を比較する
NULLIF と CASE の類似性を示すため、次のクエリでは、MakeFlag 列と FinishedGoodsFlag 列の値が同じかどうかを評価します。最初のクエリでは NULLIF を使用します。2 番目のクエリでは 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