On ne peut se passer d'une méthode pour se mettre en quête de la vérité des choses. René DESCARTES
Ne vous y trompez pas, il s'agit bien de requête sur les attributs (les données), et non de requêtes spatiales, nous les aborderons une prochaine fois. En fait, j'appelle requête de sélection/modification lorsque la requête ne porte que sur une couche. Les requêtes spatiales vont intervenir en croisant 2 ou plus couches.
À gauche, la sélection par expression, à droite, la calculatrice de champs (pour ajouter ou modifier des champs)
fenêtre de saisie d'expressions (qgis2.10)
Pour écrire de belles requêtes, il faut déjà connaitre tous ce que l'on peut faire avec QGIS, bon on peut tout faire me diront certains, mais commençons par utiliser les outils à disposition.
[wpfmb type='warning'] les "" sont utilisés pour le nom des champs, et on utilise ' ' pour les variables (c'est à dire les valeurs saisies) texte et rien pour les variables en chiffres ('1' est le caractère 1, 1 est le chiffre 1). Prenez l'habitude de les utiliser même si Qgis vous propose parfois de faire sans. [/wpfmb]
Je vais donc aborder les essentielles ou pas évidentes à mettre en œuvre
On va ajouter le signe ^ signe de puissance 2^2=2²=4 ; 4^4=4⁴=256...
le signe modulo %, c'est à dire le reste de la division (en rouge dans l'image), comme en CM1 quand vous ne connaissiez pas la virgule. 19 % 6 = 1
Et le très important signe de concaténation, || qui permet de souder 2 chaînes de caractères.
2 || 2 → 22
'bonjour' || ', ' || 'monsieur' || (2*2) → bonjour, monsieur4 ; notez la présence des parenthèses pour le calcul.
Parlons aussi de IS permet de vérifier que la valeur des 2 saisies est la même, pour les chiffres, on appele cela =
4 IS 4 → 4 = 4 va retourner 1 car la comparaison est vraie
'quatre' IS NULL → 'quatre' = rien va retourner 0 car la comparaison est fausse.
'quatre' IS 4 va retourner 0, des lettres ce n'est pas des chiffres...
Avec NOT : 'quatre' IS NOT NULL va retourner 1 (vrai) car quatre ce n'est pas rien mais ce n'est pas 4 non plus.
[wpfmb type='warning'] attention NULL n'est pas 0, NULL c'est rien et zéro ce n'est pas rien, c'est zéro ! Dans un champ, si le champ est vide alors "champs" IS NULL est vrai (retourne 1) mais si le champs est à zéro "champs" IS NULL va retourner 0, car le champ est rempli d'un zero ! [/wpfmb]
CASE et CASE ELSE : c'est la même chose. Cela permet d’enchainer les vérifications de conditions, de tester plusieurs questions. En français, on pourrait traduire ça en :
Dans les cas suivants(CASE)
Quand(WHEN) truc est égal à machin alors(THEN) fais truc
Quand(WHEN) bidule est plus grand que truc alors(THEN) met la valeur de machin à 0
(…)
Sinon (ELSE), pour tous les autres cas, fais un autre truc.
fini (END)
ELSE sert donc quand on veut modifier un truc dans tous les autres cas non listés dans un WHEN.
Dans le cadre d'une sélection, cela peut donner ceci pour sélectionner les départements 29 et 06
CASE
WHEN "CODE_DEPT" = '29' THEN '1'
WHEN "CODE_DEPT" = '06' THEN '1'
END
Sous entendu
CASE
WHEN "CODE_DEPT" = '29' THEN '1'
WHEN "CODE_DEPT" = '06' THEN '1'
ELSE '0'
END
Mais, il est à mon avis plus simple de faire "CODE_DEPT" = '29' OR "CODE_DEPT" = '06'
Dans le cas d'un calcul de champs, imaginons que je veux mettre le champs 123 à FIN pour le département 29 et ALP pour le département 06 et je ne change rien pour les autres départements
CASE
WHEN "CODE_DEPT" = '29' THEN "123" ='FIN'
WHEN "CODE_DEPT" = '06' THEN "123" = 'ALP'
END
Si maintenant, je veux la même chose et mettre HOP dans tous les autres départements
CASE
WHEN "CODE_DEPT" = '29' THEN "123" ='FIN'
WHEN "CODE_DEPT" = '06' THEN "123" = 'ALP'
ELSE "123" = 'HOP'
END
Ok ?
regexp_match, si vous êtes un as en regexp pas besoin de vous expliquer, si vous voulez le devenir : https://docs.python.org/3.5/library/re.html (bonne chance). C'est très puissant quand on maitrise les expressions régulières, mais j'avoue que sans pense bête à coté de soi, il faut pratiquer tous les jours pour s'en sortir.
[wpfmb] ASTUCE, avec un clic-droit sur le champs, vous pouvez obtenir les 10 valeurs les plus représentées dans le champs [/wpfmb]
ROUND (3.14,1) → 3.1 ; FLOOR(3.14) → 3 ; CEIL (3.14) → 4
Parlons quand même de TRIM qui est très utile pour nettoyer des saisies de tabulation ou d'espace en début ou en fin de phrase.
Le plus intéressant et la partie RECENT, qui stocke vos 20 dernières requêtes et donc évites de retaper ou de recréer toutes les requêtes fabuleuses que vous avez faîtes.
C'est bien beau tout ça, mais je n'ai pas vraiment aborder d'exemples concrets. Et bien passons à un autre article...