banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#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: 95

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: 3843

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: 95

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: 95

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: 95

Re: QGIS: Requetes

sambre42 a écrit:

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: 95

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: 95

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: 95

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 ! smile

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: 95

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: 3843

Re: QGIS: Requetes

@sambre42, trois messages pour la même demande ne semble pas relever d'une bonne pratique...

Hors ligne

 

Pied de page des forums

Powered by FluxBB