web-dev-qa-db-fra.com

MySQL: sélection des lignes où une colonne est nulle

J'ai un problème où lorsque j'essaie de sélectionner les lignes qui ont une valeur NULL pour une certaine colonne, un ensemble vide est renvoyé. Cependant, quand je regarde la table dans phpMyAdmin, elle dit null pour la plupart des lignes.

Ma requête ressemble à ceci:

SELECT pid FROM planets WHERE userid = NULL

Vide mis à chaque fois.

Beaucoup d'endroits disaient pour s'assurer qu'ils n'étaient pas stockés sous la forme "NULL" ou "null" au lieu d'une valeur réelle, et l'un d'entre eux essayait de chercher uniquement un espace (userid = ' ') mais aucun de ceux-ci n'avait fonctionné. Il a été suggéré de ne pas utiliser MyISAM ni d'innoDB car MyISAM ne parvient pas à stocker null. J'ai basculé la table sur innoDB mais maintenant, j'ai le sentiment que le problème est peut-être qu'elle n'est toujours pas nulle en raison de la manière dont elle pourrait la convertir. Je voudrais faire cela sans avoir à recréer la table en innoDB ou quoi que ce soit d'autre, mais si nécessaire, je peux certainement essayer.

244
The.Anti.9

SQL NULL est spécial, et vous devez faire WHERE field IS NULL, car NULL ne peut être égal à rien,

y compris lui-même (c'est-à-dire que NULL = NULL est toujours faux).

Voir Rule 3https://en.wikipedia.org/wiki/Codd%27s_12_rules

476
Marc B
SELECT pid FROM planets WHERE userid IS NULL
61
Michael Pakhantsov

Comme tous ont des réponses, je veux ajouter un peu plus. J'avais également fait face au même problème.

Pourquoi votre requête a-t-elle échoué? Tu as,

SELECT pid FROM planets WHERE userid = NULL;

Cela ne vous donnera pas le résultat attendu, car de doc mysql

En SQL, , la valeur NULL n'est jamais vraie en comparaison d'une autre valeur, même NULL. Une expression contenant NULL produit toujours une valeur NULL, sauf indication contraire. dans la documentation pour les opérateurs et les fonctions impliqués dans l'expression.

L'accent est à moi.

Pour rechercher des valeurs de colonne NULL, vous ne pouvez pas utiliser un test expr = NULL. L'instruction suivante ne renvoie aucune ligne car expr = NULL n'est jamais vrai pour aucune expression

Solution

SELECT pid FROM planets WHERE userid IS NULL; 

Pour tester NULL, utilisez les opérateurs IS NULL et IS NOT NULL.

36
Aniket Kulkarni

Il y a aussi un opérateur <=>:

SELECT pid FROM planets WHERE userid <=> NULL

Travaillerait. La bonne chose est que <=> peut également être utilisé avec des valeurs non NULL:

SELECT NULL <=> NULL donne 1.

SELECT 42 <=> 42 donne également 1.

Voir ici: https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to

12
obe

Informations de http://w3schools.com/sql/sql_null_values.asp :

1) Les valeurs NULL représentent des données inconnues manquantes.

2) Par défaut, une colonne de table peut contenir des valeurs NULL.

3) Les valeurs NULL sont traitées différemment des autres valeurs

4) Il n'est pas possible de comparer NULL et 0; ils ne sont pas équivalents.

5) Il n'est pas possible de tester les valeurs NULL avec des opérateurs de comparaison, tels que =, <ou <>.

6) Nous devrons utiliser les opérateurs IS NULL et IS NOT NULL

Donc en cas de problème:

SELECT pid FROM planets WHERE userid IS NULL
11
minhas23

Avait le même problème où requête:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

n'a renvoyé aucune valeur. Cela semble être un problème avec MyISAM et la même requête sur les données dans InnoDB a renvoyé les résultats attendus.

Allé avec:

SELECT * FROM 'column' WHERE 'column' = ' '; 

Renvoyé tous les résultats attendus.

8
RichKenny
SELECT pid FROM planets WHERE userid is null;
2
user

J'ai eu le même problème lors de la conversion de bases de données d'Access vers MySQL (utilisation de vb.net pour communiquer avec la base de données).

Je devais évaluer si un champ (type de champ varchar (1)) était nul.

Cette déclaration a fonctionné pour mon scénario:

SELECT * FROM [table name] WHERE [field name] = ''
0
user2406670