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


270

J'ai un problème où lorsque j'essaie de sélectionner les lignes qui ont un NULL pour une certaine colonne, il renvoie un ensemble vide. Cependant, lorsque je regarde le tableau dans phpMyAdmin, il indique null pour la plupart des lignes.

Ma requête ressemble à ceci:

SELECT pid FROM planets WHERE userid = NULL

Ensemble vide à chaque fois.

Beaucoup d'endroits ont dit de s'assurer qu'ils ne sont pas stockés comme "NULL" ou "null" au lieu d'une valeur réelle, et l'un a dit d'essayer de chercher juste un espace ( userid = ' ') mais aucun de ceux-ci n'a fonctionné. Il a été suggéré de ne pas utiliser MyISAM et d'utiliser innoDB car MyISAM a du mal à stocker null. J'ai changé la table en innoDB mais maintenant je pense que le problème peut être qu'elle n'est toujours pas nulle en raison de la façon dont elle pourrait la convertir. Je voudrais le faire sans avoir à recréer la table en tant qu'innoDB ou autre chose, mais si je le dois, je peux certainement essayer cela.


1
MyISAM n'a aucun problème à stocker null. La sémantique des NULL eux-mêmes doit être indépendante du moteur.
MarkR

Réponses:


513

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

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

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


25
C'est inconnu - pas faux. SQL utilise trois logiques de valeur.
Martin Smith

39
NULL = NULL n'est pas vraiment FAUX - c'est encore NULL. Mais ce n'est pas vrai non plus, donc IF (NULL = NULL) ne s'exécutera pas.
Konerak

1
voir aussi @obe answer: SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
Thomas

Non seulement null n'est égal à rien, il n'est pas non plus égal à rien non plus. En d' autres termes, select * from foo where bar <> "abc"ne pas retourner les lignes où la barre est nulle. Cela m'a jeté une boucle aujourd'hui. Les documents appellent <>l'opérateur "différent de", mais en réalité, c'est l'opérateur "est égal à autre chose que".
StackOverthrow


39

Comme tous reçoivent 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 depuis mysql doc

En SQL, la valeur NULL n'est jamais vraie par rapport à toute autre valeur, même NULL. Une expression qui contient NULL produit toujours une valeur NULL, sauf indication contraire dans la documentation des opérateurs et fonctions impliqués dans l'expression.

Je souligne.

Pour rechercher les valeurs de colonne qui le sont NULL, vous ne pouvez pas utiliser de expr = NULLtest. L'instruction suivante ne renvoie aucune ligne, car elle expr = NULLn'est jamais vraie pour aucune expression

Solution

SELECT pid FROM planets WHERE userid IS NULL; 

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



11

Informations sur 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 à la place les opérateurs IS NULL et IS NOT NULL

Donc en cas de problème:

SELECT pid FROM planets WHERE userid IS NULL

7

Eu le même problème où la requête:

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

n'a retourné aucune valeur. 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.



0

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

J'avais besoin d'é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] = ''

1
Si cela a fonctionné pour vous, la valeur par défaut pour votre varchar (1) est '' plutôt que null, donc sans rapport avec cette question.
さ り げ な い 告白
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.