다음을 통해 공유


NULLIF(Transact-SQL)

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

지정된 두 식이 같으면 Null 값을 반환합니다. 예를 들어 SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different;는 두 입력 값이 동일하기 때문에 첫 번째 열(4 및 4)에 대해 NULL을 반환합니다. 두 번째 열은 두 입력 값이 다르기 때문에 첫 번째 값(5)을 반환합니다.

Transact-SQL 구문 표기 규칙

구문

NULLIF ( expression , expression )  

인수

expression
유효한 스칼라 입니다.

반환 형식

첫 번째 과 동일한 형식을 반환합니다.

NULLIF는 두 식이 같지 않으면 첫 번째 을 반환합니다. 식이 같으면 NULLIF는 첫 번째 형식의 Null 값을 반환합니다.

설명

NULLIF는 두 식이 동일하며 결과 식이 NULL인 검색된 CASE 식과 동일합니다.

NULLIF 함수 내에 RAND()와 같은 시간에 종속적인 함수를 사용하지 않는 것이 좋습니다. 이렇게 하면 함수가 두 번 평가되고 두 호출에서 다른 결과가 반환됩니다.

예제

A. 변경되지 않은 예산 반환

다음 예에서는 부서(budgets), 금년도 예산(dept) 및 전년도 예산(current_year)을 보여 주는 previous_year 테이블을 만듭니다. 금년 예산이 전년도 예산에서 변하지 않은 부서에는 NULL이 예산이 아직 결정되지 않은 부서에는 0이 사용됩니다. 예산이 결정된 부서만의 평균을 계산하고 이전 연도의 예산 값(previous_year 값 사용. 여기서 current_yearNULL임)을 포함하려면 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의 유사점을 보여 주기 위해 다음 쿼리는 MakeFlagFinishedGoodsFlag 열의 값이 같은지 여부를 평가합니다. 첫 번째 쿼리에서는 NULLIF를 사용합니다. 두 번째 쿼리에서는 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 테이블을 생성하고, 데이터를 로드하고, NULLIF를 사용하여 current_year가 null이거나 previous_year와 동일한 데이터를 포함한 경우 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)