次の方法で共有


NULLIF (Transact-SQL)

指定された 2 つの式が等しい場合に NULL 値を返します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

NULLIF ( expression , 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