Recherche…


Introduction

Dans SQL Server, NULL représente les données manquantes ou inconnues. Cela signifie que NULL n'est pas vraiment une valeur; c'est mieux décrit comme un espace réservé pour une valeur. C'est aussi la raison pour laquelle vous ne pouvez comparer NULL à aucune valeur, ni même à un autre NULL .

Remarques

SQL Server fournit d'autres méthodes pour gérer les ISNULL() IS NOT NULL , telles que IS NULL , IS NOT NULL , ISNULL() , COALESCE() et autres.

Comparaison NULL

NULL est un cas particulier en matière de comparaisons.

Supposons les données suivantes.

id someVal
 ----
 0 NULL
 1 1
 2 2

Avec une requête:

 SELECT id
 FROM table
 WHERE someVal = 1

retournerait l'identifiant 1

 SELECT id
 FROM table
 WHERE someVal <> 1

retournerait l'identifiant 2

 SELECT id
 FROM table
 WHERE someVal IS NULL

retournerait l'identifiant 0

 SELECT id
 FROM table
 WHERE someVal IS NOT NULL

renverrait les deux identifiants 1 et 2 .

Si vous souhaitez que les valeurs NULL soient "comptées" en tant que valeurs dans une comparaison = , <> , elles doivent d'abord être converties en un type de données dénombrable:

 SELECT id
 FROM table
 WHERE ISNULL(someVal, -1) <> 1

OU

 SELECT id
 FROM table
 WHERE someVal IS NULL OR someVal <> 1

renvoie 0 et 2

Ou vous pouvez changer votre paramètre ANSI Null .

ANSI NULLS

À partir de MSDN

Dans une future version de SQL Server, ANSI_NULLS sera toujours activé et toute application définissant explicitement l'option sur OFF générera une erreur. Évitez d'utiliser cette fonctionnalité dans les nouveaux travaux de développement et prévoyez de modifier les applications qui utilisent actuellement cette fonctionnalité.

ANSI NULLS étant défini sur off, permet une comparaison = / <> des valeurs NULL.

Compte tenu des données suivantes:

id someVal
 ----
 0 NULL
 1 1
 2 2

Et avec ANSI NULLS, cette requête:

 SELECT id
 FROM table
 WHERE someVal = NULL

ne produirait aucun résultat. Cependant, la même requête, avec ANSI NULLS désactivé:

 set ansi_nulls off

 SELECT id
 FROM table
 WHERE someVal = NULL

Retournerait l'identifiant 0 .

ISNULL ()

La fonction IsNull() accepte deux paramètres et renvoie le deuxième paramètre si le premier est null .

Paramètres:

  1. cocher l'expression. Toute expression de n'importe quel type de données.
  2. valeur de remplacement. C'est la valeur qui serait renvoyée si l'expression de vérification est nulle. La valeur de remplacement doit être d'un type de données pouvant être implicitement converti dans le type de données de l'expression de contrôle.

La fonction IsNull() renvoie le même type de données que l'expression de vérification.

DECLARE @MyInt int -- All variables are null until they are set with values.

SELECT ISNULL(@MyInt, 3) -- Returns 3.

Voir aussi COALESCE , ci-dessus

Est nul / n'est pas nul

Étant donné que null n'est pas une valeur, vous ne pouvez pas utiliser d'opérateurs de comparaison avec des valeurs NULL.
Pour vérifier si une colonne ou une variable contient null, vous devez utiliser la valeur is null :

DECLARE @Date date = '2016-08-03'

L'instruction suivante sélectionne la valeur 6 , car toutes les comparaisons avec des valeurs nulles sont considérées comme fausses ou inconnues:

SELECT CASE WHEN @Date = NULL THEN 1
            WHEN @Date <> NULL THEN 2
            WHEN @Date > NULL THEN 3
            WHEN @Date < NULL THEN 4
            WHEN @Date IS NULL THEN 5
            WHEN @Date IS NOT NULL THEN 6

En définissant le contenu de la variable @Date sur null et réessayez, l'instruction suivante renverra 5 :

SET @Date = NULL -- Note that the '=' here is an assignment operator!

SELECT CASE WHEN @Date = NULL THEN 1
            WHEN @Date <> NULL THEN 2
            WHEN @Date > NULL THEN 3
            WHEN @Date < NULL THEN 4
            WHEN @Date IS NULL THEN 5
            WHEN @Date IS NOT NULL THEN 6

COALESCE ()

COALESCE () Evalue les arguments dans l'ordre et retourne la valeur actuelle de la première expression qui n'est pas initialement évaluée à NULL .

DECLARE @MyInt int -- variable is null until it is set with value.
DECLARE @MyInt2 int -- variable is null until it is set with value.
DECLARE @MyInt3 int -- variable is null until it is set with value.

SET @MyInt3  = 3

SELECT COALESCE (@MyInt, @MyInt2 ,@MyInt3 ,5) -- Returns 3 : value of @MyInt3.

Bien qu'ISNULL () fonctionne de manière similaire à COALESCE (), la fonction ISNULL () n'accepte que deux paramètres - un à vérifier et l'autre à utiliser si le premier paramètre est NULL. Voir aussi ISNULL , ci-dessous

NULL avec NOT IN SubQuery

Tout en ne manipulant pas la sous-requête avec la valeur NULL dans la sous-requête, nous devons éliminer NULLS pour obtenir les résultats attendus.

create table #outertable (i int)
create table #innertable (i int)

insert into #outertable (i) values (1), (2),(3),(4), (5)
insert into #innertable (i) values (2), (3), (null)

select * from #outertable where i in (select i from #innertable)
--2
--3
--So far so good

select * from #outertable where i not in (select i from #innertable)
--Expectation here is to get 1,4,5 but it is not. It will get empty results because of the NULL it executes as {select * from #outertable where i not in (null)}

--To fix this 
select * from #outertable where i not in (select i from #innertable where i is not null)
--you will get expected results
--1
--4
--5

Bien que la gestion de la sous-requête avec null soit prudente avec votre sortie attendue



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow