Sdílet prostřednictvím


NULLIF (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Vrátí hodnotu null, pokud jsou dva zadané výrazy stejné. Například SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; vrátí hodnotu NULL pro první sloupec (4 a 4), protože dvě vstupní hodnoty jsou stejné. Druhý sloupec vrátí první hodnotu (5), protože dvě vstupní hodnoty se liší.

Transact-SQL konvence syntaxe

Syntax

NULLIF ( expression , expression )  

Arguments

expression
Je libovolný platný skalární výraz.

Návratové typy

Vrátí stejný typ jako první výraz.

Funkce NULLIF vrátí první výraz , pokud se dva výrazy nerovnají. Pokud jsou výrazy stejné, vrátí funkce NULLIF hodnotu null typu prvního výrazu.

Remarks

NULLIF je ekvivalentem hledaného výrazu CASE, ve kterém jsou dva výrazy stejné a výsledný výraz je NULL.

Doporučujeme, abyste v rámci funkce NULLIF nepoužíli funkce závislé na čase, například RAND(). To může způsobit, že se funkce vyhodnotí dvakrát a vrátí odlišné výsledky ze dvou vyvolání.

Examples

A. Vrácení rozpočtových částek, které se nezměnily

Následující příklad vytvoří budgets tabulku, která zobrazí oddělení (dept) aktuální rozpočet (current_year) a předchozí rozpočet (previous_year). Pro aktuální rok NULL se používá pro oddělení s rozpočty, které se nezměnily z předchozího roku, a 0 používá se pro rozpočty, které ještě nebyly určeny. Chcete-li zjistit průměr pouze těch oddělení, která obdrží rozpočet, a zahrnout hodnotu rozpočtu z předchozího roku (použijte previous_year hodnotu, kde current_year je NULL), kombinujte NULLIF funkce a COALESCE funkce.

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  

Tady je soubor výsledků.

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

B. Porovnání HODNOT NULLIF a CASE

Aby se zobrazila podobnost mezi NULLIF a CASE, následující dotazy vyhodnocují, jestli jsou hodnoty ve MakeFlagFinishedGoodsFlag sloupcích stejné. První dotaz používá NULLIF. Druhý dotaz používá CASE výraz.

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: Vrácení rozpočtových částek, které neobsahují žádná data

Následující příklad vytvoří budgets tabulku, načte data a používá NULLIF k vrácení hodnoty null, pokud current_year je null nebo obsahuje stejná data jako previous_year.


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;  

Tady je soubor výsledků.

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

Viz také

PŘÍPAD (Transact-SQL)
desetinné a číselné (Transact-SQL)
systémové funkce (Transact-SQL)