Les requêtes du Graal

Cet article est le n° 1 sur 2 dans la série : Requêtes

Dans un autre article, nous avons monté un pseudo-cadastre. Mais comment chercher. Quelque soit le fichier, il est temps de se pencher sur les requêtes. C’est donc parti pour

LES REQUÊTES DU GRAAL

Nous avons plusieurs fois affaire à des requêtes, c’est à dire des questions, c’est même l’intérêt d’un SIG. Dans QGis, il y a ce que j’appellerai les requêtes d’affichage et les requêtes de sélection.

Je repars sur la couche GEOFLA des communes pour les exemples (vous pouvez la retrouver dans cet article passionant ).

Les requêtes d’affichage

Sont accessibles soit par le menu couche ou même CTRL+F, soit par clic-droit sur la couche

filtrer l'affichage
filtrer l’affichage

On obtient donc une fenêtre spécifique scindée en 4 parties :

fenêtre filtre
fenêtre filtre
  1. le nom des champs de la couche.
  2. les valeurs du champs choisi, en cliquant sur Tout (si le volume de données est raisonnable) ou Échantillons (si le volume est énorme, cela permet de se remémorer la forme du contenu)
  3. les opérateurs (cf. plus bas)
  4. la fenêtre dans laquelle on peut lire ou écrire l’expression de la requête (ou filtre)

Les opérateurs

Dans cette partie, il n’y a pas d’aide pour vous rappeler à quoi servent les différents boutons. Je ne fais de théorie, je vais faire des exemples.

=, <, >, >= , <=

ne devraient pas soulever de questions ardues. Sauf peut-être pour les lettres, oui, ces  symboles mathématiques peuvent fonctionner sur des chaînes alphanumériques (des lettres, quoi)

  • « NOM_COM » > ‘B’  ou « NOM_COM » >= ‘B’ élimine toutes les communes qui commence par A.
  • « NOM_COM » < ‘BE’ va sortir toutes les communes qui commencent par A et BA (mais aussi BB,BD, si y’en avait……).

En fait, imaginer votre liste triée par ordre alphabétique et faîtes un trait au niveau du B, si vous garder le haut de la liste, vous avez fait > ‘B’…et inversement pour le bas <‘B’. Je vous laisse méditre là-dessus et faire des essais aux résultats parfois surprenants.

!=

signifie différent de, il fonctionne aussi  sous sa forme <>

LIKE et ILIKE

Rien à voir avec bookFace. C’est 2 mots permettent de faire une recherche sur des «modèles». Avant les exemples, il est important de préciser précise que LIKE est sensible à la casse (MAJUSCULE-minuscules) alors ILIKE ne l’est pas. Sauf recherches particulières, j’ai donc tendance à utiliser que ILIKE.

  • « NOM_DEPT » LIKE ‘FINISTERE’  ⇒tester⇒ 283 lignes
  • « NOM_DEPT » LIKE ‘finistere’  ⇒tester⇒ 0 lignes
  • « NOM_DEPT » ILIKE ‘FINISTERE’  ⇒tester⇒ 283 lignes
  • « NOM_DEPT » ILIKE ‘finisTERE’  ⇒tester⇒ 283 lignes
Aprés plusieurs tests, je ne rends compte que LIKE agit comme ILIKE dans mon QGIS 2.10, c’est pénible pour la démo mais pas grave. Gardons toutefois les bonnes habitudes et la différence des 2 en tête.

Vous remarquerez qu’il faut le contenu exact et entier pour qu’ils fonctionnent, aussi LIKE et ILIKE sont quasi indissociables des caractères «jokers» % et _ .

% et _

Ces caractères dits JOKER vont permettent de remplacer une partie du contenu recherché.

% remplace une chaîne entière (plusieurs caractères)

  • « NOM_DEPT » (I)LIKE ‘FINIS%’  ⇒tester⇒ va sortir tout ce qui commence par FINIS (FINISTERE, FINIS, FINISBLABLA, FINIS123……)
  • « NOM_DEPT » (I)LIKE ‘%ERE‘  ⇒tester⇒ va sortir tout ce qui finit par ERE (FINISTERE, ISERE, LOZERE, BLABLAERE, 2323ERE……)
  • « NOM_DEPT » (I)LIKE ‘%ER%’  ⇒tester⇒ va donc sortir tout ce qui contient ER quelquepart (ALLIER, CHER, FINISTERE, GERS, HERAULT, ISERE, LOZERE, TERRITOIRE DE BELFORT…)

Quizz : devinez ce que sort ‘A%E’ ?

_ (underscore), qui n’est pas dans les boutons, c’est mon astuce du chef à moi, ne remplace que 1 caractère, c’est donc comme la case blanche du scrabble®

  • « NOM_DEPT » (I)LIKE ‘A_B’  ⇒tester⇒ va sortir ABB, ACB, A2B mais pas ABBB, A123B ou AaaalalalacB

AND, OR

Deux autres boutons AND (ET) et OR (ou), ces expressions permettent de compiler plusieurs recherches. Un peu d’Algèbre de Boole (non, restez, cela va être simple) avant de montrer les exemples.

Donc pour Boole et ses potes

AND (ET)

condition 1AND ou ET ou .condition 2 resultat
vraieANDvraie=vrai
vraieANDfausse=faux
fausseANDvraie=faux
fausseANDfausse=faux

Le ET fait en sorte que les 2 conditions doivent être remplies pour que le résultat soit positif (vrai ou 1). C’est donc Fromage ET dessert, vous mangez les deux ou rien.

OR (OU)

condition 1OR ou OU ou +condition 2résultats
vraieORvraievraie
vraieORfaussevraie
fausseORvraievraie
fausseORfaussefaux

le OU fait en sorte que l’une des deux conditions doit être vraie pour que le résultat soit positif (vrai ou 1). C’est donc Fromage OU dessert, vous mangez forcément l’un ou l’autre , voire les deux.

Comment cela intervient dans nos filtres, on peut s’en servir pour cumuler 2 requêtes

  • « CODE_DEPT »  = ’29’  AND « NOM_COM »  ILIKE  ‘A%’  ⇒ Ici, seules 3 communes remplissent les 2 critères : département 29 et commune commençant par A (Audierne, Argol, Arzano)
  • « CODE_DEPT »  = ’29’  OR « NOM_COM »  ILIKE  ‘A%’  ⇒ Je vais avoir toutes les communes du département 29 (la condition 1 est vraie pour ces communes) et toutes les communes commençant par « A » (la condition 2 est vraie pour ces communes) = 2207 résultats

Ça fait mal aux crâne au début mais cela vient vite. Et puis rien n’empêche de se tromper et de taper OR à la place AND ou inversement, pour essayer.

IN, NOT IN

In or not in, that is the question : whether ’tis nobler……

Ces 2 petits mots permettent d’enchaîner plusieurs valeurs uniques dans un élément, c’est un élément de sous-requête. Cela ne vous parle pas, moi non plus alors exemple concret.

Au lieu de faire « CODE_DEPT » = ’22’ OR « CODE_DEPT » = ’29’ OR « CODE_DEPT » = ’56’ qui me permet d’afficher les départements 22,29 et 56.

je peux faire « CODE_DEPT » IN (’22’,’29’,’56’), ce qui est plus simple lorsque l’on a pleins de valeurs. Attention, prenez bien soin à respecter la syntaxe avec les ( et , à taper vous-même.

Le NOT IN fait l’inverse de IN, donc « CODE_DEPT » NOT IN (’22’,’29’,’56’) va afficher tous les départements sauf les 22,29,56.

NOT

Pour vous embrouiller par rapport à avant, le NOT permet de sortir le résultat inverse de celui demandé. Donc quelque soit ma requête, si je mets NOT devant, j’obtiens l’inverse de ma demande.

NOT « NOM_DEPT » (I)LIKE ‘%ER%’ va me sortir toutes les communes qui ne contiennent pas ER dedans,
NOT « CODE_DEPT »  = ’29’ va afficher tous les départements sauf le 29, j’aurais pu faire aussi « CODE_DEPT » != ’29’ ou « CODE_DEPT » NOT IN (’29’)

Quizz : Que me sort NOT « CODE_DEPT » NOT IN (’22’,’29’,’56’) ?

En fait c’est pratique lorsque vous avez une requête super costaud et que vous voulez inverser son résultat sans tout retaper ou modifier.

Enfin

Voilà, on a fait le tour des requêtes d’affichage, pour l’essentiel, mais vous vous doutez bien que l’on peut faire plein de chose. En fait, c’est du SQL déguisé donc on peut y inclure d’autres expressions.

NavigationConstructeur d’expressions >>