Gérer les valeurs NULL
Une valeur NULL signifie aucune valeur ou inconnu. Elle ne signifie pas zéro ou vide, ou même une chaîne vide. Ces valeurs ne sont pas inconnues. Une valeur NULL peut être utilisée pour les valeurs qui n’ont pas encore été fournies, par exemple lorsqu’un client n’a pas encore fourni d’adresse de messagerie. Comme vous l’avez vu précédemment, une valeur NULL peut également être retournée par certaines fonctions de conversion si une valeur n’est pas compatible avec le type de données cible.
Vous devez souvent prendre des mesures spéciales pour traiter la valeur NULL. NULL est plutôt une absence de valeur. Elle est inconnue. Elle n’est égale à rien et n’est pas non égale à quoi que ce soit. La valeur NULL n’est supérieure ou inférieure à rien. Nous ne pouvons rien dire sur ce qu’elle est, mais il est parfois nécessaire de travailler avec des valeurs NULL. Heureusement, T-SQL fournit des fonctions de conversion ou de remplacement de valeurs NULL.
ISNULL
La fonction ISNULL prend deux arguments. Le premier est une expression que nous testons. Si la valeur du premier argument est NULL, la fonction retourne le second argument. Si la première expression n’est pas null, elle est retournée inchangée.
Par exemple, supposons que la table Sales.Customer dans une base de données comprenne une colonne MiddleName qui autorise les valeurs NULL. Lors de l’interrogation de cette table, au lieu de retourner NULL dans le résultat, vous pouvez choisir de retourner une valeur spécifique, telle que « None ».
SELECT FirstName,
ISNULL(MiddleName, 'None') AS MiddleIfAny,
LastName
FROM Sales.Customer;
Les résultats de cette requête peuvent se présenter comme suit :
FirstName
MiddleIfAny
LastName
Orlando
N.
Gee
Keith
Aucun
Howard
Donna
F.
Gonzales
...
...
...
Notes
La valeur substituée à NULL doit être du même type de données que l’expression en cours d’évaluation. Dans l’exemple ci-dessus, MiddleName est un varchar, donc la valeur de remplacement ne peut pas être numérique. En outre, vous devez choisir une valeur qui n’apparaîtra pas dans les données comme une valeur normale. Il peut parfois être difficile de trouver une valeur qui n’apparaîtra jamais dans vos données.
L’exemple précédent gérait une valeur NULL dans la table source, mais vous pouvez utiliser ISNULL avec n’importe quelle expression susceptible de retourner une valeur NULL, notamment en imbriquant une fonction TRY_CONVERT dans une fonction ISNULL.
COALESCE
La fonction ISNULL ne figurant pas dans la norme ANSI, vous souhaiterez peut-être utiliser la fonction COALESCE à la place. COALESCE est un peu plus flexible : elle peut accepter un nombre variable d’arguments, chacun d’entre eux étant une expression. Elle retourne la première expression de la liste qui n’a pas la valeur NULL.
S’il n’y a que deux arguments, COALESCE se comporte comme ISNULL. Toutefois, avec plus de deux arguments, COALESCE peut être utilisée comme alternative à une expression CASE à plusieurs parties avec ISNULL.
Si tous les arguments sont NULL, COALESCE retourne la valeur NULL. Toutes les expressions doivent retourner les mêmes types de données ou des types de données compatibles.
La syntaxe est la suivante :
SELECT COALESCE ( expression1, expression2, [ ,...n ] )
L’exemple suivant utilise une table fictive appelée HR.Wages, qui comprend trois colonnes avec des informations sur les résultats hebdomadaires des employés : taux horaire, salaire hebdomadaire et commission par unité vendue. Cependant, chaque employé ne perçoit qu'un seul type de salaire. Pour chaque employé, l’une de ces trois colonnes aura une valeur, et les deux autres la valeur NULL. Pour déterminer le montant total payé à chaque employé, vous pouvez utiliser COALESCE pour retourner uniquement la valeur non null trouvée dans ces trois colonnes.
SELECT EmployeeID,
COALESCE(HourlyRate * 40,
WeeklySalary,
Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;
Les résultats devraient ressembler à ceci :
EmployeeID (IDEmployé)
WeeklyEarnings
1
899.76
2
1001.00
3
1298.77
...
...
NULLIF
La fonction NULLIF vous permet de retourner la valeur NULL sous certaines conditions. Cette fonction a des applications utiles dans des domaines tels que le nettoyage de données, lorsque vous souhaitez remplacer des espaces blancs ou des espaces réservés par des valeurs NULL.
NULLIF accepte deux arguments et retourne la valeur NULL s’ils sont équivalents. S’ils ne sont pas égaux, NULLIF retourne le premier argument.
Dans cet exemple, NULLIF remplace une remise de 0 par une valeur NULL. Elle retourne la valeur de la remise si elle n’est pas égale à 0 :
SELECT SalesOrderID,
ProductID,
UnitPrice,
NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;
Les résultats devraient ressembler à ceci :
SalesOrderID
ProductID
UnitPrice
Remise
71774
836
356.898
NULL
71780
988
112.998
0.4
71781
748
818.7
NULL
71781
985
112.998
0.4
...
...
...
...