#1 Wed 25 September 2019 15:58
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
QGIS: Requetes
Bonjour,
je suis en train de faire des requêtes sur une table T où je concatène deux champs A (varchar) et B (varchar) pour implémenter un 3è champ C (varchar).
là ou je rame un peu c'est pour la condition. je dois rajouter un zéro au début du champ A (varchar) si le propriétaire est X avec la caractéristique z.
et faire la concaténation. La question c'est ensuite ou avant? Et comment écrire cette condition CASE WHEN THEN,
pour l'instant j'en suis là
ALTER TABLE T
ADD COLUMN IF NOT EXISTS C Varchar;
UPDATE T
SET C =CONCAT( A, '/', B)
l'écriture de la condition, est ce que c'est correct déjà?
CASE WHEN proprietaire=’Truc’ AND CASE type=’Appui’
THEN INSERT ‘0’ INTO A
un peu d'aide ca serait super! svp :-(
Hors ligne
#2 Wed 25 September 2019 16:47
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Requetes
En SQL dans postgres ce serait plutôt :
UPDATE T SET A = CASE /*condition 1 */ WHEN propriétaire = 'truc' AND type = 'Appui' THEN '0'
/*condition 2*/ WHEN propriétaire = 'machin' AND type = 'Appui' THEN '1'
/* autres valeurs hors condition 1 et 2*/ ELSE '2'
END;
Si vous passez uniquement par Qgis, ne mettez que la clause CASE dans la calculatrice de champ.
Hors ligne
#3 Thu 26 September 2019 09:53
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
Bonjour,
déjà, merci pour la réponse,
je travaille avec pgadmin avec connexion postgis, donc les requetes je les fait sur pgadmin
UPDATE T SET A = CASE /*condition 1 */ WHEN propriétaire = 'machin' AND type = 'Appui' THEN '0'
ensuite, pour la condition 2*, est ce que je peux mettre WHEN propriétaire <> 'machin' AND type = 'Appui' THEN '1'
car j'ai différents noms de machin et c'est pour éviter de mettre la liste
quand je mets la requete dans pgadmin ça me met un message d'erreur
UPDATE T SET A= CASE WHEN Propriétaire = 'machin' AND Type = 'Appui' THEN '0'
WHEN Propriétaire <> 'machin' AND Type <> 'Appui' THEN '1'
ELSE '2'
END;
message erreur:
ERROR: column "propriétaire" does not exist
LINE 1: UPDATE T SET A = CASE WHEN Propriétaire = 'machin...
^
********** Erreur **********
ERROR: column "propriétaire" does not exist
État SQL :42703
Caractère : 39
pourtant cette colonne Propriétaire existe....
une idée?
Hors ligne
#4 Thu 26 September 2019 09:58
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS: Requetes
Bonjour,
pourtant cette colonne Propriétaire existe....
Écrite telle quelle? Auquel cas, il faudra le mettre entre "" et attention aux majuscules/minuscules.
Hors ligne
#5 Thu 26 September 2019 10:00
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Requetes
Pas de problème pour votre seconde condition.
je pense que l'accent y est pour quelque chose dans votre message d'erreur.
Hors ligne
#6 Thu 26 September 2019 11:14
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
d'accord, je vais modifier pour l'accent et vérifier l'orthographe de Propriétaire
et comment je peux voir le résultat de ma requête dans Qgis via ma connexion PostGis?
Hors ligne
#7 Thu 26 September 2019 12:00
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Requetes
Importez la couche dans QGIS avec le menu couche -> ajouter une couche -> ajoutez des couches Postgis et paramétrez une nouvelle connexion.
Si c'est déjà fait, un rafraîchissement de la couche devrait suffire
Dernière modification par Ben22 (Thu 26 September 2019 12:09)
Hors ligne
#8 Fri 27 September 2019 10:14
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
j'ai amélioré la requête qui fonctionne à présent merci
par contre la fonction CASE WHEN THEN ne fonctionne qu'avec du boleen ou du binaire (oui non, 1 2) vrai? (désolée si c'est pas le bon mot, c'est pour l'idée...
dans ce cas, comment je peux écrire que si Nom=0, alors Nom= concaténation de A et de B?
qu'est ce que je dois rajouter à ma requête suivante de ce fait?
ALTER TABLE T
ADD COLUMN IF NOT EXISTS Nom Varchar;
ALTER TABLE T
ALTER COLUMN insee TYPE Varchar USING (insee::Integrer::Varchar);
UPDATE T set A = CONCAT(0,A) WHERE LENGTH(A)=6
UPDATE T
SET Nom =CONCAT( A, '/', insee);
UPDATE T SET Nom = CASE WHEN prop = machin' AND type = 'APPUI' THEN '0'
WHEN prop <> ' machin' AND type <> 'APPUI' THEN '1'
ELSE '2'
END;
merci!
Dernière modification par sambre42 (Fri 27 September 2019 10:20)
Hors ligne
#9 Fri 27 September 2019 10:25
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Requetes
dans ce cas, comment je peux écrire que si Nom=0, alors Nom= concaténation de A et de B?
qu'est ce que je dois rajouter à ma requête suivante de ce fait?
Je le ferai comme ça (à ajouter dans votre condition CASE) :
Code:
... WHEN Nom= '0' THEN A || B ELSE ...;
edit : le sujet serait peut-être à déplacer dans GeoBD vu que la question tourne principalement autour de Postgres ?..
Dernière modification par Ben22 (Fri 27 September 2019 11:08)
Hors ligne
#10 Fri 27 September 2019 11:42
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
non ca ne se mets pas à jour, mais du coup je n'ai plus de valeur 0 ou 1 non plus
donc j'ai refait la concatenation avec resutat 1 2 dans champ Nom et j'ai du coup créé un champ NomConcat pour recueillir la concaténation
ALTER TABLE T
ADD COLUMN IF NOT EXISTS NomConcat Varchar;
Et comme il me faut absolument un / entre le champ A et le champ B dans la concaténation, est ce que la requête écrite comme ça a des chance de fonctionner en l'améliorant? pour l'instant j'ai un message d'erreur
UPDATE T SET NomConcat = CASE WHEN Nom= '0' THEN CONCAT( A, '/', B);
Hors ligne
#11 Fri 27 September 2019 12:01
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Requetes
Je reprends donc vos requêtes de mise à jour :
1- mise à jour du champ nom en fonction du champ "propriétaire" et "type" :
Code:
UPDATE T SET Nom = CASE WHEN prop = machin' AND type = 'APPUI' THEN '0' WHEN prop <> ' machin' AND type <> 'APPUI' THEN '1' ELSE '2' END;
2 - Mise à jour du champ "NomConcat" en fonction du champ "Nom" :
si une seul condition, vous pouvez l'écrire de cette façon :
Code:
UPDATE T SET NomConcat = CONCAT( A, '/', B) WHERE Nom= '0';
Est-ce bien ce que vous attendiez ?
Hors ligne
#12 Fri 27 September 2019 14:12
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
c'est en effet ce que j'attends mai cela ne fonctionne pas sus pgadmin...est ce qu'il faut indiquer je sais pas un lien avec la clé premaire? pour le lien se fasse bien?
Hors ligne
#13 Fri 27 September 2019 14:48
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Requetes
Pas de message d'erreur ?
Code:
est ce qu'il faut indiquer je sais pas un lien avec la clé premaire? pour le lien se fasse bien?
Les colonnes concernées par la requête sont bien dans une seule et même table ou y-a t'il une jointure à faire avec une autre table ?
Hors ligne
#14 Fri 27 September 2019 15:44
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
non, juste une table ou il faut concaténer deux champs avec un / entre les deux champs (devant le champ B) et un 0 devant l'un des deux champs_devant le champ A
le format souhaité est ‘’A’’ / ‘’B’’
si je j’exécute toutes les requêtes à la suite, j'ai un blocage au niveau UPDATE T SET Nom
ALTER TABLE T
ADD COLUMN IF NOT EXISTS Nom Varchar;
ALTER TABLE T
ALTER COLUMN insee TYPE Varchar USING (insee::Integrer::Varchar);
UPDATE T set A = CONCAT(0,A) WHERE LENGTH(A)=6
UPDATE T
SET Nom =CONCAT( A, '/', B);
UPDATE T SET Nom = CASE WHEN prop = machin' AND type = 'APPUI' THEN '0'
WHEN prop <> ' machin' AND type <> 'APPUI' THEN '1'
ELSE '2'
END;
UPDATE T SET Nom = CONCAT(A,B) WHERE Nom= '0';
et j'ai tourné dans tous les sens et je ne comprends pas. estce que je dois inverser l'ordre des requetes?
Hors ligne
#15 Fri 27 September 2019 15:56
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Requetes
Vous parlez de blocage, pouvez vous nous copiez le message d'erreur qui vous est retourné.
D'autre part, je vois que vous écrivez le champ Nom avec une majuscule, dans ce cas mieux vaut le mettre entre doubles guillemets : "Nom" :
Code:
UPDATE T SET "Nom" =CONCAT( A, '/', B);
Postgres est assez stricte sur l'orthographe des colonnes, et on le comprend !
Hors ligne
#16 Fri 27 September 2019 16:00
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
voici le message d'erreur:
********** Erreur **********
ERROR: syntax error at or near "UPDATE"
État SQL :42601
Caractère : 217
autrement dans le requete UPDATE T set A = CONCAT(0,A) WHERE LENGTH(A)=6, j'ai supprimé WHERE LENGTH(A)=6 et executé juste ça me donne un bon résultat pou UPDATE T set A = CONCAT(0,A) avec le 0 devant le A
est ce que je dois faire la même chose avec le / devant le B?
Hors ligne
#17 Fri 27 September 2019 16:15
- Ben22
- Participant actif
- Lieu: 33
- Date d'inscription: 11 May 2016
- Messages: 96
Re: QGIS: Requetes
Je me demande si dans ce code la et au vu du message d'erreur, il ne manque pas le point virgule à la fin de votre 3eme requête.
ALTER TABLE T
ADD COLUMN IF NOT EXISTS Nom Varchar;
ALTER TABLE T
ALTER COLUMN insee TYPE Varchar USING (insee::Integrer::Varchar);
UPDATE T set A = CONCAT(0,A) WHERE LENGTH(A)=6 ; -- <-- ici !
UPDATE T
SET Nom =CONCAT( A, '/', B);
UPDATE T SET Nom = CASE WHEN prop = machin' AND type = 'APPUI' THEN '0'
WHEN prop <> ' machin' AND type <> 'APPUI' THEN '1'
ELSE '2'
END;
UPDATE T SET Nom = CONCAT(A,B) WHERE Nom= '0';
Si ça n'est pas ça essayez d’exécuter une a une vos requêtes update;
Dernière modification par Ben22 (Fri 27 September 2019 16:16)
Hors ligne
#18 Fri 27 September 2019 16:18
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
quand j'execute les requetes une par une ça fonctionne, c'est l'ensemble.
ok je vais rajouter le ; et voir
Hors ligne
#19 Mon 30 September 2019 09:12
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
Bonjour,
Je veux enlever le / dans mon champ insee
j'ai cette requete ci pour faire cela: replace("insee",'/','')
si je l'adapte à ma demande, ca donne bien UPDATE TABLE T SET insee = ("insee",'/','') ?
ou est ce que je dois garder REPLACE?
Hors ligne
#20 Mon 30 September 2019 10:35
- erwannlh
- Participant occasionnel
- Date d'inscription: 8 Sep 2015
- Messages: 19
Re: QGIS: Requetes
salut,
il faut conserver le REPLACE
cela correspond a cette focntion
https://sql.sh/fonctions/replace
Hors ligne
#21 Mon 30 September 2019 17:07
- sambre42
- Participant occasionnel
- Date d'inscription: 13 Sep 2019
- Messages: 18
Re: QGIS: Requetes
Bonjour, comment je dois ecrire la requete suivante? si le champ a 2 caractere alors ajouter 4 zero
j'avais pensé à CASE WHEN champ X=2 THEN ADD 0000 ou quelque chose dans le genre
le champ X=2 ne me parait pas correcte car il fait reference à la valeur et non à la longueur de champ. Comment je peux modifier cela?
Hors ligne
#22 Mon 30 September 2019 18:24
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3945
Re: QGIS: Requetes
@sambre42, trois messages pour la même demande ne semble pas relever d'une bonne pratique...
Hors ligne