J'ai une table qui a une colonne de valeurs qui peuvent être rowTypeID = (1,2,3 ou null). J'aimerais écrire une requête qui renvoie toute ligne qui n'a pas la valeur 3. Dans cet exemple, je veux toutes les lignes NULL avec les 1,2 lignes. Je ne veux tout simplement pas de lignes avec la valeur 3.
Définir ANSI null ON est actuellement défini pour la base de données.
Je suis curieux de savoir pourquoi je ne peux pas écrire
select * from myTable where myCol <> 3
Cette requête ne renverra aucune ligne contenant NULL dans la colonne myCol.
Je dois ecrire
select * from my Table where myCol <> 3 or myCol Is NULL
Dois-je toujours inclure le IS NULL ou puis-je le configurer pour qu'une clause where myCol <> 3 renvoie des lignes dont la valeur est Null pour mon Col
Je pense que votre approche est bien:
SELECT *
FROM MyTable
WHERE myCol <> 3 OR myCol IS NULL
Puisque vous demandez des alternatives, vous pouvez également créer votre colonne NOT NULL
et stocker une autre valeur (non utilisée inattendue) dans la base de données au lieu de NULL
- par exemple -1
. Ensuite, l'expression myCol <> 3
correspondra à votre fake -NULL
comme il le ferait avec n'importe quelle autre valeur.
SELECT *
FROM MyTable
WHERE myCol <> 3
Cependant, en général, je recommanderais not d'utiliser cette approche. La façon dont vous le faites déjà est la bonne.
Il convient également de mentionner que plusieurs autres bases de données prennent en charge IS DISTINCT FROM
, qui fait exactement ce que vous voulez:
SELECT *
FROM MyTable
WHERE myCol IS DISTINCT FROM 3
MySQL a la même valeur NULL-safe qui peut également être utilisé à cette fin:
SELECT *
FROM MyTable
WHERE NOT myCol <=> 3
Malheureusement, SQL Server ne prend encore en charge aucune de ces syntaxes.
Vous devez gérer les valeurs NULL d'une manière ou d'une autre, car les expressions impliquant NULL
sont évaluées par Unknown . Si vous voulez, vous pouvez plutôt faire:
select *
from MyTable
where isnull(MyColumn, -1) <> 3
Mais cela implique un nombre magique (-1), et est sans doute moins lisible que le test original pour IS NULL
.
Edit: et, comme SQLMenace le souligne, n'est pas SARGable .
Lorsque vous testez une valeur, toutes les valeurs NULL sont omises. Après tout, vous testez si la valeur de certaines colonnes satisfait à certains critères et si NULL est pas une valeur .
Dois-je toujours inclure le IS NULL ou puis-je le configurer pour qu'une clause where myCol <> 3 renvoie des lignes dont la valeur est Null pour mon Col?
Vous toujours , toujours , devez toujours inclure is null
.
Parce que 3 n’est pas égal à Non/Applicable et qu’il n’est pas égal à Unkown.
parce que vous ne pouvez pas comparer NULL à autre chose, NULL n'est même pas égal à NULL
DECLARE @i INT
DECLARE @i2 INT
SELECT @i = NULL, @i2 = NULL
IF @i = @i2
PRINT 'equal'
ELSE
PRINT 'not equal'