web-dev-qa-db-fra.com

MYSQL Left Join comment sélectionner des valeurs NULL?

Ceci est une question complémentaire à ma dernière question sur les jointures de table dans MySQL

J'ai besoin de pouvoir sélectionner les valeurs NULL dans le tableau joint à gauche.

Voici ma jointure:

table1.id | table1.name | table2.id | table2.surname
        1 |        John |         1 |            Doe
        2 |     Michael |         2 |       Anderson
        3 |        Anna |      NULL |           NULL
        4 |         Sue |      NULL |           NULL

Je voudrais select WHERE table2.surname = NULL, mais une requête comme celle-ci ne fonctionne pas:

SELECT table1.*,table2.*
FROM table1
LEFT JOIN table2
    ON table1.id=table2.id
WHERE table2.surname=NULL

Je peux comprendre quelque peu la logique derrière cela ne me donnant aucun résultat, mais il doit y avoir un moyen de les saisir?

Appréciez toute aide.

34
user1177811

Pour comparer les valeurs de NULL, vous devez utiliser le IS NULL prédicat, comme ceci:

SELECT table1.*, table2.*
FROM table1
LEFT JOIN table2 ON table1.id=table2.id
WHERE table2.surname IS NULL
43
Mahmoud Gamal

Vous devez utiliser IS NULL au lieu de = NULL:

WHERE table2.surname IS NULL

La raison pour laquelle vous ne pouvez pas simplement faire = NULL est parce que NULL est essentiellement un "inconnu" et ne peut pas égal ou différent de à quoi que ce soit (même pas lui-même), donc essayer de le comparer à quelque chose comme s'il était censé être une correspondance exacte serait renvoyez simplement NULL au lieu d'un booléen attendu 0 ou 1, et c'est exactement pourquoi votre requête renvoyait un résultat vide.

Il y a une nette différence entre "est inconnu" et "est inconnu" . Vous pouvez sûrement tester si quelque chose est inconnu ou n'est pas inconnu, mais vous ne pouvez pas tester si quelque chose "est égal à " inconnu car inconnu est inconnu , et cela n'aurait aucun sens.

De plus, comme vous utilisez MySQL, une autre option serait d'utiliser table2.surname <=> NULL, où <=> est un opérateur de comparaison NULL-Safe spécifique à MySQL, mais essayez de ne pas l'utiliser et de vous en tenir à la méthode SQL standard (IS NULL/IS NOT NULL)

13
Zane Bien

essayez avec:

SELECT table1.*,table2.* 
FROM table1 
  LEFT JOIN table2 ON table1.id=table2.id 
WHERE table2.surname IS NULL
4
Tudor Constantin

Selon spécification MySQL vous devez utiliser "IS NULL" au lieu de "= NULL". Il indique que "(NULL = NULL) est égal à NULL". Mais NULL est égal à False alors qu'il est utilisé comme booléen.

1
V.I.S.