Freigeben über


NULLIF (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric

Gibt einen NULL-Wert zurück, wenn die beiden angegebenen Ausdrücke gleich sind. Beispielsweise gibt SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; für die erste Spalte (4 und 4) NULL zurück, da die zwei Eingabewerte identisch sind. Die zweite Spalte gibt den ersten Wert (5) zurück, da die beiden Werte sich unterscheiden.

Transact-SQL-Syntaxkonventionen

Syntax

NULLIF ( expression , expression )  

Argumente

expression
Alle gültigen Skalarausdrücke.

Rückgabetypen

Gibt denselben Typ wie der erste Ausdruck zurück.

NULLIF gibt den ersten Ausdruck zurück, wenn sich die zwei Ausdrücke voneinander unterscheiden. Wenn die Ausdrücke identisch sind, gibt NULLIF einen NULL-Wert mit dem Typ des ersten Ausdrucks zurück.

Hinweise

NULLIF entspricht einem komplexen CASE-Ausdruck, in dem die beiden Ausdrücke gleich sind und der sich ergebende Ausdruck NULL ist.

Es empfiehlt sich nicht, zeitabhängige Funktionen wie RAND() innerhalb einer NULLIF-Funktion zu verwenden. Dies könnte dazu führen, dass die Funktion zweimal ausgewertet wird und aus den beiden Aufrufen unterschiedliche Ergebnisse zurückgibt.

Beispiele

A. Zurückgeben von Budgetsummen, die sich nicht geändert haben

Im folgenden Beispiel wird eine budgets-Tabelle erstellt, die eine Abteilung (dept), ihr aktuelles Jahresbudget (current_year) und ihr Budget vom Vorjahr (previous_year) anzeigt. Für das laufende Jahr wird NULL verwendet, wenn sich das Budget einer Abteilung gegenüber dem Vorjahr nicht verändert hat. Der Wert 0 wird verwendet, wenn das Budget noch nicht festgelegt wurde. Wenn Sie nur für die Abteilungen, die ein Budget erhalten, den Durchschnittswert ermitteln und außerdem die Budgethöhe des vergangenen Jahres einschließen möchten (d. h., wenn Sie den Wert von previous_year verwenden möchten, in dem der Wert für current_year gleich NULL ist), kombinieren Sie die Funktionen NULLIF und 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  

Hier sehen Sie das Ergebnis.

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

B. Vergleichen von NULLIF und CASE

Als Beispiel für die Ähnlichkeit von NULLIF und CASE wird in den folgenden Abfragen ausgewertet, ob die Werte in den Spalten MakeFlag und FinishedGoodsFlag gleich sind. In der ersten Abfrage wird NULLIF verwendet. In der zweiten Abfrage wird der CASE-Ausdruck verwendet.

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: Zurückgeben von Budgetsummen, die keine Daten enthalten

Im folgenden Beispiel werden eine budgets-Tabelle erstellt, Daten geladen und NULLIF verwendet, um NULL zurückzugeben, wenn current_year NULL ist oder dieselben Daten wie previous_year enthält.


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;  

Hier sehen Sie das Ergebnis.

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

Weitere Informationen

CASE (Transact-SQL)
decimal und numeric (Transact-SQL)
Systemfunktionen (Transact-SQL)