La clause where dans la requête sql de supprimer aussi les valeurs null
J'ai ces tables:
'Utilisateurs'
id email name last_access
1 luca@gmail.com Luca Pluto 2012-10-05 17:21:22.0
2 pippo@gmail.com Irene Pippo 2012-10-05 17:22:25.0
'Nets_permissions'
user_id network_id perm
1 1234 3
1 1235 1
2 1235 3
J'ai écrit cette requête:
SELECT u.id, u.name, n.perm
FROM users as u LEFT OUTER JOIN nets_permissions as n
ON u.id = n.user_id
WHERE n.network_id=1234 AND n.perm <> 3
parce que je veux que les utilisateurs qui ont déjà une autorisation pour network_id (1234) , mais aussi les utilisateurs qui ne disposent pas d'une autorisation pour la network_id. En d'autres termes, je voudrais avoir ce résultat de la requête:
2 null null
parce que l'utilisateur Luca Pluton avec l'id=1, le net est 1234, ont perm=3 je tiens donc à gauche. Au lieu de cela, l'utilisateur Irene Pippo avec id=2 ne dispose pas d'une autorisation sur le 1234 net. Il est donc ligne doit avoir net_id et perm mis à null.
Mon résultat de la requête est vide. Je ne sais pas pourquoi. Sans la clause n.perm <> 3 semble bien fonctionner, mais après aussi la valeur null sont laissés de côté, non seulement le rws avec perm=3.
J'ai aussi essayé de cette façon:
SELECT u.id, u.name, n.perm FROM users as u LEFT OUTER JOIN
(select * from nets_permissions WHERE network_id=1234) as n on u.id = n.user_id
WHERE n.perm <> 3
mais ça ne fonctionne pas. sans la clause where de toutes les œuvres. Après pas. Le résultat de la requête est vide.
Comment je peux résoudre ce problème? J'ai besoin que la perm colonne est une valeur ou une valeur null, je ne peux pas supprimer cette colonne.
Vous devez vous connecter pour publier un commentaire.
La solution est:
Ici Travailler avec des Valeurs NULL il y a un expanation du traitement des valeurs NULLES dans MySQL
Merci à vous tous pour votre aide!
De nombreux dialecte SQL à l'aide d'un trinary logique avec
NULL
la troisième valeur supplémentaire àtrue
etfalse
.Rien comparé à
NULL
résultats deNULL
qui est traitée commefalse
.Donc
x = null
entraînerafalse
pour tousx
, tout commex != null
Si vous souhaitez inclure
NULL
valeurs dans le résultat, vous devez ajouter un traitement spécial pour que (Oracle syntaxe):1 Luca Pluto 3
WHERE
entièrement et mettre le tout dans leJOIN
condition. Cela a encore le même problème. Vous avez seulement besoin d'unWHERE
ici si vous essayez de filtrer surusers
J'aime les utilisateurs de la "JOINTURE" de la syntaxe. Il a d'autres avantages, en plus de faire du code plus facile à lire, que les gens ne réalisent pas.