Microsoft SQL Server
NULL
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:
- cocher l'expression. Toute expression de n'importe quel type de données.
- 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