Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
je dois remplacer les valeurs du champ "ROUTE" champ dans toutes les tables du schéma "test".
Ma requête est :
DO
$do$
DECLARE
sch text := 'test';
tbl text;
BEGIN
FOR tbl IN
SELECT tablename FROM pg_catalog.pg_tables
WHERE schemaname = sch
LOOP
EXECUTE format($$UPDATE %I.%I SET "ROUTE" = replace("ROUTE", 'G', '_G')$$, sch, tbl);
END LOOP;
END
$do$;
Mais ça remplace toutes les routes remplissant cette condition.
En réalité, ma requête dois remplir toutes les conditions suivantes mais je n'arrive pas à imbriquer les 2 codes.
CASE
WHEN "ROUTE" = '10 D0001G' THEN '10 D0001G'
WHEN "ROUTE" LIKE '%G%' THEN replace ("ROUTE" , 'G', '_G')
WHEN "ROUTE" LIKE '%E_%' THEN REPLACE ("ROUTE" , 'E', '_E')
WHEN "ROUTE" LIKE '%B_' THEN REPLACE ("ROUTE" , 'B', '_B')
ELSE "ROUTE"
END
Savez-vous comment faire ?
Merci par avance pour votre aide.
Hors ligne
Bonjour
Mais ça remplace toutes les routes remplissant cette condition.
Quelle condition exactement? Vous n'avez aucune clause where donc la mise à jour va s'effectuer sur toutes les lignes, que le contenu change ou non.
Savez-vous comment faire ?
Utiliser ce CASE dans votre SET "ROUTE" ne fonctionne pas ? Quelle est l'erreur ?
Julien.
https://rjuju.github.io/
Hors ligne
Merci pour votre retour.
Quelle condition exactement? Vous n'avez aucune clause where donc la mise à jour va s'effectuer sur toutes les lignes, que le contenu change ou non.
Si la route contient un 'G' ça le remplace par '_G'
Utiliser ce CASE dans votre SET "ROUTE" ne fonctionne pas ? Quelle est l'erreur ?
En integrant CASE dans SET ci-dessous :
DO
$do$
DECLARE
sch text := 'test'; -- your schema here
tbl text;
BEGIN
FOR tbl IN
SELECT tablename FROM pg_catalog.pg_tables
WHERE schemaname = sch
LOOP
EXECUTE format($$UPDATE %I.%I SET "ROUTE" =
CASE
WHEN "ROUTE" = '10 D0001G' THEN '10 D0001G'
WHEN "ROUTE" LIKE '%G%' THEN replace ("ROUTE" , 'G', '_G')
WHEN "ROUTE" LIKE '%E_%' THEN REPLACE ("ROUTE" , 'E', '_E')
WHEN "ROUTE" LIKE '%B_' THEN REPLACE ("ROUTE" , 'B', '_B')
ELSE "ROUTE"
END
$$, sch, tbl);
END LOOP;
END
$do$;
J'ai l'erreur :
ERREUR: spécificateur de type « G » pour format() non reconnu
HINT: Pour un unique "%" utilisez "%%".
CONTEXT: fonction PL/pgsql inline_code_block, ligne 1 à EXECUTE
Hors ligne
Après avoir retourné le problème dans tous les sens, l'erreur est toute bête.
Il faut simplement mettre %% à la place de % comme indiqué dans le résultat d'erreur
Merci rjuju pour le placement du CASE car je ne savais pas comment faire.
Hors ligne
Pages : 1