Quelle est la différence entre! = NULL et IS NOT NULL dans les expressions de filtre QGIS?

26

J'ai un calque de forme avec un attribut contenant des NULLvaleurs auxquelles j'aimerais appliquer un filtre pour des valeurs différentes de NULL.

entrez la description de l'image ici

En utilisant l'interface graphique disponible pour une telle construction de requête, on essaierait intuitivement

"obj_art" != NULL

entrez la description de l'image ici

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:

entrez la description de l'image ici

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 != NULLet IS NOT NULL?

Jochen Schwarze
la source
Pour autant que je sache, ce n'est que de la syntaxe. Lorsque l'utilisation nulle est ou n'est pas. Sinon, utilisez = ou! =
nielsgerrits
"on essaierait intuitivement" Vraiment? Pourquoi? NULL n'est pas une valeur. C'est littéralement l'absence de valeur. Vous ne pouvez pas "égaler" NULL! L'opérateur !=ne signifie pas «n'est pas»; cela signifie "n'est pas égal à". IS NOTsignifie "n'est pas" donc je pense que c'est parfaitement intuitif :)
Courses de légèreté avec Monica
@LightnessRacesinOrbit Sans comprendre que ce NULLn'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 ce NULLn'est pas une valeur qu'il est vraiment intuitif d'utiliser IS NOTplutôt que !=. Beaucoup ne savent pas ce qu'est NULLvraiment un .
Midavalo
Et en outre, dans l'interface graphique NULLest dans la liste des valeurs (cp. Ci-dessus), et donc traitée comme une valeur «normale». Et il n'y a pas de bouton IS NULL, ou ai-je raté ça?! Donc, en tapant simplement une telle requête et avec les connaissances, cela NULLdoit être traité d'une manière spéciale, nous pourrions discuter de l'intuition, mais pour shure pas dans le contexte de CET GUI.
Jochen Schwarze
@Midavalo: Bien que ce soit vrai, je suggérerais humblement de ne pas utiliser une fonctionnalité de langage sans chercher ce que c'est :) La programmation par devinettes ne fonctionne pas.
Courses de légèreté avec Monica

Réponses:

33

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 toujours null. Mais pour tester null, SQL est livré avec la IS (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.

Karpfen
la source
19

NULLn'est pas une valeur, donc il ne peut rien égal =ou pas égal !=. Ce n'est pas la même chose que zéro 0qui est une valeur.

Un NULLindique 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 cellule IS NULLou si elleIS NOT NULL

  • IS NULL vérifie si la cellule est vide
  • IS NOT NULL vérifie si la cellule n'est pas vide

Si vous avez des enregistrements où un valeurs sont One, Two, Threeet le reste NULLet vous voulez trouver tout ce qui est pas Twovous avez besoin d'utiliser quelque chose comme

value != '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 les NULLenregistrements seront exclus car ce NULLn'est pas une valeur qui peut être égale ou non égale.

Midavalo
la source