NULLIF (Transact-SQL)
Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス
指定された 2 つの式が等しい場合に NULL 値を返します。 たとえば、SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different;
の最初の列 (4 と 4) は、2 つの入力値が同じなので NULL を返します。 2 つ目の列は、2 つの入力値が異なるため、最初の値 (5) を返します。
構文
NULLIF ( expression , expression )
引数
式 (expression)
任意の有効なスカラー式です。
戻り値の型
最初の式と同じ型を返します。
NULLIF は、2 つの式が等しくない場合、最初の式を返します。 式が等しい場合、NULLIF は最初の式のデータ型の NULL 値を返します。
注釈
NULLIF は、2 つの式を比較し、その 2 つが等価な場合に NULL を返す検索 CASE 式と同じです。
NULLIF 関数の中では、RAND() など時間に依存する関数は使用しないことをお勧めします。 関数が 2 回呼び出されて評価され、それぞれ異なる結果が返されることがあります。
例
A. 変更のない予算額を返す
次の例では、部門 (dept
)、今年度予算 (current_year
)、および昨年度予算 (previous_year
) で構成される budgets
テーブルを作成します。 今年度予算が昨年度予算と変わらない部門については 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
を使用します。 2 番目のクエリでは 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
テーブルを作成し、データを読み込み、current_year
が null であるか、previous_year
と同じデータが含まれている場合は NULLIF
を使用して null を返します。
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)