web-dev-qa-db-fra.com

SQL Server renvoie les lignes qui ne sont pas égales <> à une valeur et NULL

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

18
pehaada

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.

15
Mark Byers

Vous devez gérer les valeurs NULL d'une manière ou d'une autre, car les expressions impliquant NULLsont é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 .

3
RedFilter

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 .

2
Joey

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.

1
nate c

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'
0
SQLMenace