NULLIF (Transact-SQL)NULLIF (Transact-SQL)

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database○Azure SQL Data Warehouse ○Parallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

指定された 2 つの式が等しい場合に NULL 値を返します。Returns a null value if the two specified expressions are equal. たとえば、SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; の最初の列 (4 と 4) は、2 つの入力値が同じなので NULL を返します。For example, SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; returns NULL for the first column (4 and 4) because the two input values are the same. 2 つ目の列は、2 つの入力値が異なるため、最初の値 (5) を返します。The second column returns the first value (5) because the two input values are different.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

NULLIF ( expression , expression )  

引数Arguments

式 (expression)expression
任意の有効なスカラーです。Is any valid scalar expression.

戻り値の型Return Types

最初のと同じ型を返します。Returns the same type as the first expression.

NULLIF は、2 つの式が等しくない場合、最初のを返します。NULLIF returns the first expression if the two expressions are not equal. 式が等しい場合、NULLIF は最初ののデータ型の NULL 値を返します。If the expressions are equal, NULLIF returns a null value of the type of the first expression.

RemarksRemarks

NULLIF は、2 つの式を比較し、その 2 つが等価な場合に NULL を返す検索 CASE 式と同じです。NULLIF is equivalent to a searched CASE expression in which the two expressions are equal and the resulting expression is NULL.

NULLIF 関数の中では、RAND() など時間に依存する関数は使用しないことをお勧めします。We recommend that you not use time-dependent functions, such as RAND(), within a NULLIF function. 関数が 2 回呼び出されて評価され、それぞれ異なる結果が返されることがあります。This could cause the function to be evaluated twice and to return different results from the two invocations.

使用例Examples

A.A. 変更のない予算額を返すReturning budget amounts that have not changed

次の例では、部門 (dept)、今年度予算 (current_year)、および昨年度予算 (previous_year) で構成される budgets テーブルを作成します。The following example creates a budgets table to show a department (dept) its current budget (current_year) and its previous budget (previous_year). 今年度予算が昨年度予算と変わらない部門については NULL を使用し、今年度予算がまだ決定していない場合は 0 を使用します。For the current year, NULL is used for departments with budgets that have not changed from the previous year, and 0 is used for budgets that have not yet been determined. 昨年度予算の値を使用する場合も含めて (previous_yearcurrent_year の場合は NULL の値を使用)、今年度予算を受け取った部門についてだけその平均値を求めるには、NULLIF 関数と COALESCE 関数を組み合わせて使用します。To find out the average of only those departments that receive a budget and to include the budget value from the previous year (use the previous_year value, where the current_year is NULL), combine the NULLIF and COALESCE functions.

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  

以下に結果セットを示します。Here is the result set.

Average Budget  
--------------  
212500.000000  
(1 row(s) affected)

B.B. NULLIF と CASE を比較するComparing NULLIF and CASE

NULLIFCASE の類似性を示すため、次のクエリでは、MakeFlag 列と FinishedGoodsFlag 列の値が同じかどうかを評価します。To show the similarity between NULLIF and CASE, the following queries evaluate whether the values in the MakeFlag and FinishedGoodsFlag columns are the same. 最初のクエリでは NULLIF を使用します。The first query uses NULLIF. 2 番目のクエリでは CASE 式を使用します。The second query uses the CASE expression.

USE AdventureWorks2012;  
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. データを含まない予算額を返すC: Returning budget amounts that contain no data

次の例では、budgets テーブルを作成し、データを読み込み、current_yearprevious_year のいずれにもデータが含まれない場合は NULLIF を使用して null を返します。The following example creates a budgets table, loads data, and uses NULLIF to return a null if neither current_year nor previous_year contains data.

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;  

以下に結果セットを示します。Here is the result set.

dept   LastBudget  
----   -----------  
1      100000.00  
2      null 
3      0.00  
4      null  
5      null

参照See Also

CASE (Transact-SQL) CASE (Transact-SQL)
decimal 型と numeric 型 (Transact-SQL) decimal and numeric (Transact-SQL)
システム関数 (Transact-SQL)System Functions (Transact-SQL)