Message posté par : Jérémie
----------------------------------------
Bonjour,
Premièrement, vous devriez utiliser les balises [ code ] et [ /code ] pour afficher votre
expression plus distinctement dans vos messages.
Il suffit de clique sur le bouton Code au dessus de la zone de saisie du message et de
mettre votre expression entre les deux crochets : [ code ] ici [ /code ]
Également, essayez d'indenter le code, c'est à dire ajouter des tabulations ou
espaces au début des lignes pour comprendre quels blocs vont ensemble. Dans ce cas,
décaler (indenter) les WHEN et THEN un niveau sous le CASE pour comprendre que ce sont
les tests du CASE.
Concernant votre besoin, il peut être pratique d'utiliser le with_variable proposé par
SANTANNA. Mais ça complique un peu la compréhension de l'expression donc je vais faire
sans dans un premier temps.
Le coalesce peut en effet être une bonne solution à votre problème, pour remplacer les
null par une valeur texte ou numérique, par exemple 0. Ce qui permet de pouvoir
fonctionner avec les test = ou <> et IN () ou NOT IN ()
Si je reprend votre expression (qui d'ailleurs n'est pas exactement du SQL même si
certaines fonctions sont les mêmes entre SQL et expressions dans QGIS).
-----------------
Code :
CASE
-- coalesce permet de récupérer la valeur de CodC15, ou alors 0 s'il est null /
idem pour CodC18
WHEN coalesce("CodC15",0) IN ('1','3') and
coalesce("CodC18",0) IN ('1','3')
THEN 'culture 2015-2018'
WHEN coalesce("CodC15",0)='1'OR "CodC15"='3' AND
coalesce("CodC18",0) NOT IN ('1','3')
THEN 'surface supprimée en 2018'
WHEN coalesce("CodC18",0) NOT IN('1','3') AND
coalesce("CodC15",0) IN ('1','3')
THEN 'surface supprimée en 2018'
WHEN coalesce("CodC18",0)='1' OR
coalesce("CodC18",0)='3' AND coalesce("CodC15",0) NOT IN
('1','3')
THEN 'surface créée en 2018'
WHEN coalesce("CodC15",0) NOT IN('1','3') AND
coalesce("CodC18",0) IN ('1','3')
THEN 'surface créée en 2018'
WHEN coalesce("CodC18",0) NOT IN('1','3') AND
coalesce("CodC15",0) IS NULL
THEN 'pas de culture'
WHEN coalesce("CodC15",0) NOT IN('1','3') AND
coalesce("CodC18",0) IS NULL
THEN 'pas de culture'
END
-----------------
Attention sur les tests à la priorité des opérateur logique AND et OR : AND est
prioritaire sur OR, donc le test
-----------------
Code :
"CodC18"='1' OR "CodC18"='3' AND "CodC15"
NOT IN ('1','3')
-----------------
sera être vrai :
quand CodeC18=1
OU
quand CodC18=3 ET que CodC15 pas dans la liste :
('1','3')
Je ne sais pas si c'est ce que vous voulez ?
Dans tous les cas il vaut mieux mettre des parenthèses pour regrouper les tests et
s'assurer qu'ils sont correctement faits, par exemple si vous vouliez que le test
soit vrai
quand CodC18=1 ou CodC18=3
ET CodC15 pas dans
la liste ('1','3')
Alors il faudrait écrire
-----------------
Code :
( "CodC18"='1' OR "CodC18"='3' ) AND
"CodC15" NOT IN ('1','3')
-----------------
Notez les parenthèses qui entourent les deux test d'égalité de valeur pour CodC18.
Avec la fonction with_variable(), ça donnerait quelque chose comme :
-----------------
Code :
-- définition de la variable v_codc15 avec la valeur de l'expression
coalesce("CodC15",0)
with_variable('v_codc15',
coalesce("CodC15",0),
-- définition de la variable v_codc18 avec la valeur de l'expression
coalesce("CodC18",0)
with_variable('v_codc18',
coalesce("CodC18",0),
-- utilisation des variable avec @nom_variable
CASE
WHEN @v_codc15 IN ('1','3') and @v_codc18 IN ('1','3')
THEN 'culture 2015-2018'
WHEN @v_codc15='1'OR @v_codc15='3' AND @v_codc18 NOT IN
('1','3')
THEN 'surface supprimée en 2018'
WHEN @v_codc18 NOT IN('1','3') AND @v_codc15 IN
('1','3')
THEN 'surface supprimée en 2018'
WHEN @v_codc18='1' OR @v_codc18='3' AND @v_codc15 NOT IN
('1','3')
THEN 'surface créée en 2018'
WHEN @v_codc15 NOT IN('1','3') AND @v_codc18 IN
('1','3')
THEN 'surface créée en 2018'
WHEN @v_codc18 NOT IN('1','3') AND @v_codc15 IS NULL
THEN 'pas de culture'
WHEN @v_codc15 NOT IN('1','3') AND @v_codc18 IS NULL
THEN 'pas de culture'
END
-----------------
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=354463#p354463
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net