PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 28/09/2021 12:54:04

Arnaud_CX
Membre

Conditions dans loop

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

#2 28/09/2021 13:16:00

rjuju
Administrateur

Re : Conditions dans loop

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 ?

Hors ligne

#3 28/09/2021 14:51:09

Arnaud_CX
Membre

Re : Conditions dans loop

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

sad sad sad

Hors ligne

#4 28/09/2021 16:38:22

Arnaud_CX
Membre

Re : Conditions dans loop

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 roll

Merci rjuju pour le placement du CASE car je ne savais pas comment faire.

Hors ligne

Pied de page des forums