Dela via


NULLIF (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Returnerar ett null-värde om de två angivna uttrycken är lika med. Returnerar till exempel SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; NULL för den första kolumnen (4 och 4) eftersom de två indatavärdena är desamma. Den andra kolumnen returnerar det första värdet (5) eftersom de två indatavärdena är olika.

Transact-SQL syntaxkonventioner

Syntax

NULLIF ( expression , expression )  

Arguments

expression
Är ett giltigt skalärt uttryck.

Return Types

Returnerar samma typ som det första uttrycket.

NULLIF returnerar det första uttrycket om de två uttrycken inte är lika med. Om uttrycken är lika returnerar NULLIF ett null-värde av typen för det första uttrycket.

Remarks

NULLIF motsvarar ett sökt CASE-uttryck där de två uttrycken är lika och det resulterande uttrycket är NULL.

Vi rekommenderar att du inte använder tidsberoende funktioner, till exempel RAND(), i en NULLIF-funktion. Detta kan göra att funktionen utvärderas två gånger och returnerar olika resultat från de två anropen.

Examples

A. Returnerar budgetbelopp som inte har ändrats

I följande exempel skapas en budgets tabell för att visa en avdelning (dept) dess aktuella budget (current_year) och dess tidigare budget (previous_year). För innevarande år NULL används för avdelningar med budgetar som inte har ändrats från föregående år och 0 används för budgetar som ännu inte har fastställts. Om du vill ta reda på genomsnittet av endast de avdelningar som tar emot en budget och inkludera budgetvärdet från föregående år (använd previous_year värdet, där current_year är NULL), kombinerar du NULLIF funktionerna och 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  

Här är resultatet.

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

B. Jämföra NULLIF och CASE

För att visa likheten mellan NULLIF och CASEutvärderar följande frågor om värdena i kolumnerna MakeFlag och FinishedGoodsFlag är desamma. Den första frågan använder NULLIF. Den andra frågan använder uttrycket 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: Returnera budgetbelopp som inte innehåller några data

I följande exempel skapas en budgets tabell, data läses in och används NULLIF för att returnera en null om current_year är null eller innehåller samma data som 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;  

Här är resultatet.

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

See Also

CASE (Transact-SQL)
decimal och numerisk (Transact-SQL)
System Functions (Transact-SQL)