web-dev-qa-db-fra.com

Comparaison MySQL avec une valeur nulle

J'ai une colonne appelée CODE dans une table MySQL qui peut être NULL. Disons que j'ai quelques lignes avec CODE = 'C' que je veux ignorer dans mon jeu de résultats sélectionné. Je peux avoir CODE = NULL ou CODE! = 'C' dans mon jeu de résultats.

La requête suivante ne renvoie pas de ligne avec CODE comme NULL:

SELECT * from TABLE where CODE!='C'

Mais cette requête fonctionne comme prévu et je sais que c'est la bonne façon de le faire.

SELECT * from TABLE where CODE IS NULL OR CODE!='C'

Ma question est pourquoi le fait d'avoir seulement CODE! = 'C' ne renvoie pas les lignes où CODE = NULL? Certainement 'C' n'est pas NULL. Nous ne comparons aucune valeur à un personnage ici. Quelqu'un peut-il éclairer pourquoi cela ne fonctionne pas de cette façon?

32
dev_musings

Dans MySQL, NULL est considéré comme une "valeur inconnue manquante", par opposition à aucune valeur. Jetez un oeil à cette référence MySQL sur NULL .

Toute comparaison arithmétique avec NULL ne renvoie pas vrai ou faux, mais renvoie NULL à la place., Donc, NULL != 'C' renvoie NULL, au lieu de renvoyer true.

Toute comparaison arithmétique avec 'NULL' retournera false. Pour vérifier cela dans SQL:

SELECT IF(NULL=123,'true','false') 

Pour vérifier les valeurs de NULL, nous devons utiliser IS NULL & IS NOT NULL opérateur.

45
Sam DeHaan

Basé sur mes tests et la documentation ici: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

Vous pouvez comparer null et obtenir un résultat booléen en utilisant <=>
REMARQUE: il ressemble à l'opérateur NOT EQ, mais c'est l'opérateur EQ

Par exemple:

select x <=> y; 
or
select @x <=> @y;

Cela compare également string vs null, string vs string, etc.

29
Alan Fullmer

En SQL, la valeur NULL est une valeur spéciale, non comparable à aucune autre. Le résultat d'une comparaison directe avec un NULL est toujours NULL, bien que (malheureusement) vous puissiez trouver FAUX dans certaines implémentations.

Pour tester une valeur nulle, vous devez utiliser IS NULL et IS NOT NULL.

14
cornuz
SELECT * 
FROM `table_name` 
WHERE IFNULL(`column_name` != 'C', TRUE)
6
Vasil Nikolov

sélectionnez * de l'utilisateur où application_id = '1223333344' et le nom est nul;

2
Vipin Pandey