次の方法で共有


NULLIF (Transact-SQL)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric Warehouse Microsoft Fabric SQL Database

指定された 2 つの式が等しい場合に NULL 値を返します。 たとえば、SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; の最初の列 (4 と 4) は、2 つの入力値が同じなので NULL を返します。 2 つ目の列は、2 つの入力値が異なるため、最初の値 (5) を返します。

Transact-SQL 構文表記規則

構文

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_yearcurrent_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 を比較する

NULLIFCASE の類似性を示すため、次のクエリでは、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)