J'ai un calque de forme avec un attribut contenant des NULL
valeurs auxquelles j'aimerais appliquer un filtre pour des valeurs différentes de NULL
.
En utilisant l'interface graphique disponible pour une telle construction de requête, on essaierait intuitivement
"obj_art" != NULL
Ce qui signifie "donnez-moi toutes les fonctionnalités avec l'attribut" obj_art "différent de NULL
" (celles-ci comptent certainement plus de 0). Tester cette requête donne un résultat étrange de mon point de vue:
Donc, ce que j'ai appris jusqu'à présent, c'est que je peux y parvenir en utilisant
"obj_art" IS NOT NULL
La question est, quelle est la différence entre != NULL
et IS NOT NULL
?
!=
ne signifie pas «n'est pas»; cela signifie "n'est pas égal à".IS NOT
signifie "n'est pas" donc je pense que c'est parfaitement intuitif :)NULL
n'est pas une valeur, je dirais qu'il est intuitif d'essayer d'utiliser=
ou!=
que c'est ainsi que vous évaluez toute autre valeur. Ce n'est que lorsque vous savez que ceNULL
n'est pas une valeur qu'il est vraiment intuitif d'utiliserIS NOT
plutôt que!=
. Beaucoup ne savent pas ce qu'estNULL
vraiment un .NULL
est dans la liste des valeurs (cp. Ci-dessus), et donc traitée comme une valeur «normale». Et il n'y a pas de boutonIS NULL
, ou ai-je raté ça?! Donc, en tapant simplement une telle requête et avec les connaissances, celaNULL
doit être traité d'une manière spéciale, nous pourrions discuter de l'intuition, mais pour shure pas dans le contexte de CET GUI.Réponses:
Avertissement: Étant donné que la syntaxe de filtrage dans QGIS fonctionne avec SQL, je suppose ici que les règles SQL s'appliquent. Je ne suis pas complètement sûr que ce soit tout à fait correct, mais cela semble logique et cela explique le comportement.
Le filtre fonctionne avec SQL, c'est pourquoi vous devez y chercher une réponse.
En bref, lorsque vous utilisez un opérateur logique en combinaison avec
null
, le résultat est toujoursnull
. Mais pour testernull
, SQL est livré avec laIS (NOT)
fonctionnalité de comparaison, qui permet de l'utiliser pour le filtrage souhaité.Consultez la réponse de Bohemian sur stackoverflow pour une discussion plus approfondie.
la source
NULL
n'est pas une valeur, donc il ne peut rien égal=
ou pas égal!=
. Ce n'est pas la même chose que zéro0
qui est une valeur.Un
NULL
indique qu'aucune valeur n'a été enregistrée dans la cellule que vous regardez. Pour vérifier si une valeur existe, vous demandez si la celluleIS NULL
ou si elleIS NOT NULL
IS NULL
vérifie si la cellule est videIS NOT NULL
vérifie si la cellule n'est pas videSi vous avez des enregistrements où un valeurs sont
One
,Two
,Three
et le resteNULL
et vous voulez trouver tout ce qui est pasTwo
vous avez besoin d'utiliser quelque chose commevalue != 'Two' OR value IS NULL
car les valeurs NULL ne sont pas renvoyées dans une requête égale / différente de. Si vous utilisez uniquement
value != 'Three'
le résultat, tous lesNULL
enregistrements seront exclus car ceNULL
n'est pas une valeur qui peut être égale ou non égale.la source