NULLIF (Transact-SQL)
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL analytics endpoint in Microsoft Fabric Warehouse in 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)