Condividi tramite


NULLIF (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Restituisce un valore Null se le due espressioni specificate sono uguali. Ad esempio, SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; restituisce NULL per la prima colonna (4 e 4) perché i due valori di input sono uguali. La seconda colonna restituisce il primo valore (5) perché i due valori di input sono diversi.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

NULLIF ( expression , expression )  

Argomenti

expression
Qualsiasi espressione scalare valida.

Tipi restituiti

Restituisce lo stesso tipo di dati del primo argomento expression.

Se le due espressioni non sono uguali, la funzione NULLIF restituisce il primo argomento expression. Se le espressioni sono uguali, NULLIF restituisce un valore Null del tipo del primo argomento expression.

Osservazioni:

NULLIF è equivalente a un'espressione CASE avanzata in cui le due espressioni sono uguali e l'espressione risultante è Null.

È consigliabile non utilizzare funzioni dipendenti dal tempo, ad esempio RAND(), in una funzione NULLIF. La funzione potrebbe essere valutata due volte e restituire risultati diversi nelle due chiamate.

Esempi

R. Restituzione degli importi del budget non modificati

Nell'esempio seguente viene creata una tabella budgets per visualizzare un reparto (dept), il relativo budget corrente (current_year) e il relativo budget precedente (previous_year). Per l'anno in corso, viene utilizzato NULL per i reparti in cui il budget dell'anno corrente è uguale a quello dell'anno precedente e 0 per i budget non ancora definiti. Per trovare la media solo dei reparti che ricevono un budget e includere inoltre il valore del budget dell'anno precedente (utilizzare il valore previous_year se current_year è NULL), vengono combinate le funzioni NULLIF e 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  

Il set di risultati è il seguente.

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

B. Confronto tra NULLIF e CASE

Per illustrare la somiglianza tra NULLIF e CASE, nelle query seguenti viene determinato se i valori nelle colonne MakeFlag e FinishedGoodsFlag corrispondono. La prima query utilizza NULLIF. La seconda query utilizza l'espressione 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. Restituzione degli importi del budget che non contengono dati

Nell'esempio seguente viene creata una tabella budgets, vengono caricati i dati e viene usato NULLIF per restituire un valore Null se current_year è Null o contiene gli stessi dati di 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;  

Il set di risultati è il seguente.

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

Vedi anche

CASE (Transact-SQL)
decimal e numeric (Transact-SQL)
Funzioni di sistema (Transact-SQL)