2017-09-05 1 views
1

J'ai une seule colonne dans une table qui ressemble à ceci:La requête mySQL select ne renvoie pas de résultats lors de l'utilisation d'une clause WHERE par rapport à une colonne NULL.

enter image description here

(field3 est NULL J'utilise QTODBC7.0 pour exécuter des requêtes SQL, et cette application rend les champs NULL apparaissent vides dans la requête. les résultats, plutôt que d'afficher le texte « NULL »)

J'ai une simple requête SQL comme suit:

select * from table where field3 <> 'randomstring' 

j'attends la requête pour retourner tous les champs où field3 ne correspond pas à la valeur de 'chaîne aléatoire'.

La colonne 'field3' n'est pas égale à la valeur de 'randomstring', par conséquent, elle doit être retournée dans la requête.

Une chose étrange se produit:

La requête ci-dessus renvoie rien!

enter image description here

field3 est donc égale à NULL, il ne correspond pas à « » randomstring donc, la ligne doit être retourné dans ma requête, mais ce n'est pas.

J'ai fait quelques tests, et j'ai découvert que ceci est dû au fait que field3 est NULL mais pas si field3 est égal à une chaîne vide (pas NULL).

Comment puis-je faire en sorte que l'instruction select fonctionne lorsqu'il peut y avoir des valeurs NULL dans field3?

+0

Utiliser 'colonne3 IS null' pour vérifier la valeur null . – jarlh

+0

Une option est ['<=>'] (https://dev.mysql.com/doc/refman/5.7/fr/comparison-operators.html#operator_equal-to) NULL-safe égal à l'opérateur. – wchiquito

Répondre

2

Ce comportement est dû à une logique à trois valeurs faisant partie de la norme SQL. Cela signifie que chaque condition booléenne peut être évaluée à true, false ou unknown et que la ligne est retournée uniquement lorsque la condition est true. Il est défini que s'il y a une valeur NULL d'un côté de l'équation (ou les deux) alors le résultat est unknown. Dans votre cas, le résultat de la condition est unknown lorsque champ3 est NULL. Par conséquent, vous devez utiliser une solution proposée par jarlh:

SELECT * FROM table WHERE field3 <> 'randomstring' or field3 IS NULL 

Dans une telle requête la condition est évaluée à true si la valeur de field3 est NULL depuis unknown or true = true

+0

Bonne explication! – cleverpaul