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.
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).
SELECT pid FROM planets WHERE userid IS NULL
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 testexpr = NULL
. L'instruction suivante ne renvoie aucune ligne carexpr = NULL
n'est jamais vrai pour aucune expression
SELECT pid FROM planets WHERE userid IS NULL;
Pour tester NULL
, utilisez les opérateurs IS NULL
et IS NOT NULL
.
NULL
.NULL
.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
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
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.
SELECT pid FROM planets WHERE userid is null;
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] = ''