Share via


Conditions de recherche avec comparaison de valeurs NULL

La valeur NULL signifie que la valeur de données pour la colonne est inconnue ou non disponible. NULL n'est pas équivalent à zéro (valeur numérique ou binaire), pas plus qu'à une chaîne vide ou à un espace (valeur caractère). Les valeurs NULL permettent de différencier la saisie d'un zéro (colonnes de type numérique) ou d'un espace (colonnes de type caractère) de l'absence de saisie (NULL pour les colonnes de type numérique ou caractère).

Il existe deux manières d'entrer des valeurs NULL dans une colonne qui les autorise (comme indiqué dans l'instruction CREATE TABLE) :

  • Si aucune donnée n'est entrée et s'il n'existe pas de valeur par défaut ou de contrainte DEFAULT portant sur la colonne ou sur le type de données, SQL Server entre automatiquement la valeur NULL.

  • L'utilisateur peut entrer la valeur NULL de manière explicite en tapant NULL sans guillemets. Si vous entrez le mot NULL dans une colonne de type caractère en l'encadrant de guillemets, il sera traité comme les lettres N, U, L, et L et non comme une valeur NULL.

Lors de l'extraction de valeurs NULL, une application affiche généralement une chaîne telle que NULL ou (NULL), ou encore (null) à l'endroit adéquat. Par exemple, la colonne Color de la table Product autorise les valeurs NULL :

USE AdventureWorks2008R2;
GO
SELECT ProductID, Name, Color
FROM AdventureWorks2008R2.Production.Product
WHERE Color IS NULL

Comparaison de valeurs NULL

Attention aux comparaisons de valeurs NULL. Le comportement de la comparaison dépend de la valeur de l'option SET ANSI_NULLS.

Si SET ANSI_NULLS a la valeur ON et si vous effectuez une comparaison avec une ou plusieurs expressions NULL, le résultat ne sera ni TRUE ni FALSE, mais UNKNOWN. Une valeur inconnue (UNKNOWN) ne peut pas être logiquement comparée à une autre valeur. Ceci se produit si une expression est comparée au littéral NULL ou si deux expressions sont comparées et que l'une d'elles correspond à la valeur NULL. Par exemple, la comparaison suivante donne toujours le résultat UNKNOWN lorsque ANSI_NULLS a la valeur ON :

ytd_sales > NULL

La comparaison suivante donne aussi le résultat UNKNOWN chaque fois que la variable contient la valeur NULL :

ytd_sales > @MyVariable

Utilisez les clauses IS NULL ou IS NOT NULL afin de tester si une valeur est NULL. Ceci peut compliquer encore la clause WHERE. Par exemple, la colonne TerritoryID de la table AdventureWorks2008R2Customer autorise les valeurs Null. Si une instruction SELECT doit rechercher des valeurs NULL en plus des autres, elle doit inclure une clause IS NULL :

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
   OR TerritoryID IS NULL

Transact-SQL peut être étendu pour permettre aux opérateurs de comparaison de retourner la valeur TRUE ou FALSE lors de comparaisons avec des valeurs NULL. Cette option est activée si la valeur OFF est attribuée à ANSI_NULLS. Lorsque ANSI_NULLS a la valeur OFF, des comparaisons telles que ColumnA = NULL retournent TRUE lorsque ColumnA contient une valeur Null et FALSE lorsque ColumnA contient des valeurs autres que NULL. Par ailleurs, la comparaison de deux expressions qui ont la valeur NULL retourne TRUE. Le paramètre ANSI_NULLS n'affecte pas les colonnes jointes qui contiennent une valeur NULL. Les lignes de colonnes jointes qui contiennent une valeur NULL ne font pas partie du jeu de résultats. Lorsque ANSI_NULLS a la valeur OFF, l'instruction SELECT suivante retourne toutes les lignes de la table Customer dont la colonne Region contient une valeur Null :

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID = NULL

Quelle que soit la valeur de ANSI_NULLS, les valeurs Null sont toujours considérées de valeur égale pour les mots clés ORDER BY, GROUP BY et DISTINCT. De même, un index unique ou une contrainte UNIQUE qui autorise les valeurs NULL ne peut contenir qu'une seule ligne incluant une valeur NULL. Toute autre ligne contenant une valeur NULL est rejetée. Une colonne appartenant à une clé primaire ne peut pas contenir de valeur NULL.

Les calculs impliquant des valeurs NULL ont la valeur NULL, car le résultat doit être UNKNOWN si l'un des facteurs est inconnu. Par exemple, column1 + 1 a la valeur NULL, si column1 est NULL.

Lorsque vous effectuez une recherche sur des colonnes autorisant les valeurs Null, vous pouvez rechercher les valeurs Null ou non Null de la base de données avec le modèle suivant :

WHERE column_name IS [NOT] NULL

Voir aussi

Référence

Concepts