NULLIF (Transact-SQL)

Retourne une valeur NULL si les deux expressions spécifiées sont égales.

Icône Lien de rubriqueConventions de syntaxe Transact-SQL

Syntaxe

NULLIF ( expression , expression )

Arguments

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.

Notes

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

A. 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.

USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.budgets','U') IS NOT NULL
   DROP TABLE budgets;
GO
SET NOCOUNT ON;
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 l'ensemble des résultats.

Budget moyen

--------------

212500.000000

(1 ligne(s) affectée(s))

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 AdventureWorks;
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