NULLIF (Transact-SQL)

S’applique à : SQL Server Base de données Azure SQL Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Point de terminaison d'analyse SQL dans Microsoft Fabric Entrepôt dans Microsoft Fabric Base de données SQL dans Microsoft Fabric

Retourne une valeur NULL si les deux expressions spécifiées sont égales. Par exemple, SELECT NULLIF(4,4) AS Same, NULLIF(5,7) AS Different; retourne la valeur NULL pour la première colonne (4 et 4) car les deux valeurs d’entrée sont identiques. La deuxième colonne retourne la première valeur (5) car les deux valeurs d’entrée sont différentes.

Conventions de la syntaxe Transact-SQL

Syntaxe

NULLIF ( expression , expression )  

Arguments

expression
Toute expression scalaire valide.

Types de retour

Retourne le même type que la première expression.

NULLIF retourne la première expression si les deux expressions ne sont pas égales. Si elles sont égales, NULLIF retourne une valeur Null du type de la première expression.

Remarques

NULLIF est équivalent à l'exécution d'une expression CASE dans laquelle les deux expressions sont identiques et l'expression résultante est NULL.

Il est recommandé de ne pas utiliser de fonction dépendant du temps, telle que RAND(), dans une fonction NULLIF. Ceci pourrait entraîner une évaluation à deux reprises de la fonction, et des résultats différents pourraient être retournés à partir des deux appels.

Exemples

R. Retour des montants de budget qui n'ont pas changé

L'exemple suivant crée une table budgets où sont répertoriés un service (dept), son budget pour l'année en cours (current_year) et son budget pour l'année précédente (previous_year). Pour l'année en cours, NULL est utilisé pour les services dont les budgets n'ont pas été modifiés par rapport à l'année précédente et 0 est utilisé pour les budgets qui n'ont pas été déterminés. Pour obtenir la moyenne des seuls services auxquels un budget a été attribué et pour inclure la valeur budgétaire de l'année précédente (utilisez la valeur previous_year dans les cas où la valeur pour current_year est NULL), combinez les fonctions NULLIF et 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  

Voici le jeu de résultats.

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

B. Comparaison de NULLIF et CASE

Pour montrer la similarité entre NULLIF et CASE, les requêtes suivantes déterminent si les valeurs des colonnes MakeFlag et FinishedGoodsFlag sont les mêmes. La première requête utilise NULLIF. La seconde requête utilise l'expression 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. Retour des montants de budget qui ne contiennent aucune donnée

L’exemple suivant crée une table budgets, charge les données et utilise NULLIF pour retourner une valeur Null si current_year a la valeur Null et contient les mêmes données que 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;  

Voici le jeu de résultats.

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

Voir aussi

CASE (Transact-SQL)
decimal et numeric (Transact-SQL)
Fonctions système (Transact-SQL)