添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

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

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

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

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

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

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

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

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

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

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

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

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