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 :-(
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.
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?
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)
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)
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) :
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)
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);
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" :
2 - Mise à jour du champ "NomConcat" en fonction du champ "Nom" :
si une seul condition, vous pouvez l'écrire de cette façon :
Est-ce bien ce que vous attendiez ?
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?
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" :
Postgres est assez stricte sur l'orthographe des colonnes, et on le comprend !
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?
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)
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?