Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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é ?

#1 Fri 27 January 2023 11:59

Sig_Passy
Membre
Date d'inscription: 17 Mar 2022
Messages: 35

Plusieurs REPLACE dans la même table, colonne

Bonjour,

Je souhaite lancer sur une table pour la même colonne une requête REPLACE pour modifier plusieurs valeurs dans cette colonne. Le tout dans une base postgressql/postgis.

Je m'explique : J'ai MA.TABLE qui contient une COLONNE qui contient des valeurs "non intelligibles" type 00,01,02,03

J'ai en parallèle un petit tableau qui m'indique que 00 = Valeur_1 (Valeur_1 étant une données intelligibles) et cela pour toutes mes valeurs.

Je voudrais via une seule requête faire la bascule de 00 vers Valeur_1,de 01 vers Valeurs_2, etc.

J'ai écris cette requête :


Code:

UPDATE MA.TABLE
SET 
COLONNE = REPLACE(COLONNE, '00', 'Valeur_1'),
COLONNE = REPLACE(COLONNE, '01', 'Valeur_2'),
COLONNE = REPLACE(COLONNE, '02', 'Valeur_3'),
COLONNE = REPLACE(COLONNE, '03', 'Valeur_4')

Mais ça ne marche pas. Et je n'arrive pas à trouver de solution.

Est ce que l'un d'entre vous pourrait m'aider ?

Merci par avance. ;-)

Dernière modification par Sig_Passy (Fri 27 January 2023 13:00)

Hors ligne

 

#2 Fri 27 January 2023 13:05

jmarsac
Membre
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 563
Site web

Re: Plusieurs REPLACE dans la même table, colonne

Bonjour,

Vous ne pouvez pas modifier plusieurs fois la même colonne dans une même requête, vous devez exécuter plusieurs requêtes (4 dans votre exemple) :

Code:

UPDATE MA.TABLE SET COLONNE = REPLACE(COLONNE, '01', 'Valeur_1');

UPDATE MA.TABLE SET COLONNE = REPLACE(COLONNE, '02', 'Valeur_2');

UPDATE MA.TABLE SET COLONNE = REPLACE(COLONNE, '03', 'Valeur_3');

UPDATE MA.TABLE SET COLONNE = REPLACE(COLONNE, '04', 'Valeur_4');

Jean-Marie
Azimut

Hors ligne

 

#3 Fri 27 January 2023 13:15

Sig_Passy
Membre
Date d'inscription: 17 Mar 2022
Messages: 35

Re: Plusieurs REPLACE dans la même table, colonne

OK, Merci pour votre réponse.

Bon Week-End.

Hors ligne

 

#4 Fri 27 January 2023 14:29

Sylvain M.
Membre
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 975

Re: Plusieurs REPLACE dans la même table, colonne

Sinon, c'est possible aussi en une requête en imbriquant les replace().

Code:

UPDATE MA.TABLE SET COLONNE = REPLACE(REPLACE(REPLACE(REPLACE(COLONNE, '01', 'Valeur_1'),'02', 'Valeur_2'),'03', 'Valeur_3'),'04', 'Valeur_4');

Sylvain M.

Hors ligne

 

#5 Fri 27 January 2023 20:43

p.jeremie
Membre
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 362

Re: Plusieurs REPLACE dans la même table, colonne

Bonjour,

Il y a plus élégant et paramétrable facilement si un jour vous avez plusieurs colonnes à mettre à jour selon une table de correspondance.
Voir ici en anglais : https://stackoverflow.com/a/18799497
Avec un sqlfiddle pour le tester : http://sqlfiddle.com/#!17/198a3/1

L'idée est d'utiliser la forme update ... from.

Code:

update ma.table as t set
    t.colonne = c.nouvelle_valeur
from (values
    ('00', 'Valeur_1'),
    ('01', 'Valeur_2'),
    ('02', 'Valeur_3'),
    ('03', 'Valeur_4')
) as c(ancienne_valeur, nouvelle_valeur) 
where c.ancienne_valeur = t.colonne;

Dernière modification par p.jeremie (Fri 27 January 2023 20:44)

Hors ligne

 

#6 Tue 31 January 2023 15:33

Sylvain M.
Membre
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 975

Re: Plusieurs REPLACE dans la même table, colonne

p.jeremie a écrit:

Il y a plus élégant et paramétrable facilement si un jour vous avez plusieurs colonnes à mettre à jour selon une table de correspondance.


Plus élégant, certes big_smile , mais il me semble que cela ne répond pas au besoin : ton code permet de mettre à jour les valeurs d'un champ, selon une table de correspondance, mais pour l'ensemble du champ.
Hors, il s'agissait ici de remplacer, au sein d'un même champ et de mêmes lignes, plusieurs valeurs.
Par exemple "01, 02, 03" devient "Valeur_1, Valeur_2, Valeur_3".

Après, je ne doute pas qu'il y ait plus élégant que les Replace() imbriqués (sans doute à chercher avec les REGEX que je ne maîtrise pas), mais en tout cas, il fonctionnent et répondent au besoin wink


Sylvain M.

Hors ligne

 

#7 Tue 31 January 2023 18:08

p.jeremie
Membre
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 362

Re: Plusieurs REPLACE dans la même table, colonne

Je viens de relire la demande d'origine et je ne vois pas où il est précisé que la colonne contient autre chose que les valeurs à remplacer.

Cependant il suffit d'adapter la requête pour faire un replace à la place de récupérer la valeur de correspondance et on arrive au même résultat que les replace imbriqués.
Un regexp_replace aurait un peu le même problème que les replace imbriqués : la lisibilité qui serait moins facile qu'avec la table de correspondance.

La requête précédente modifiée pour faire un replace :

Code:

update ma.table as t set
    t.colonne = replace(t.colonne,c.ancienne_valeur,c.nouvelle_valeur)
from (values
    ('00', 'Valeur_1'),
    ('01', 'Valeur_2'),
    ('02', 'Valeur_3'),
    ('03', 'Valeur_4')
) as c(ancienne_valeur, nouvelle_valeur) 
where t.colonne like concat('%',c.ancienne_valeur,'%');

Hors ligne

 

#8 Wed 01 February 2023 16:16

Sylvain M.
Membre
Lieu: Saint-Pierre-des-Nids (53)
Date d'inscription: 8 Sep 2005
Messages: 975

Re: Plusieurs REPLACE dans la même table, colonne

Bonjour Jérémie,
En effet, j'ai sans doute extrapolé la demande.
Mais super : tu as donc réussi à répondre aux 2 problématiques : bravo et merci smile
(pas testée, mais je pense en avoir l'utilité un de ces jours : j'essaierai de retrouver ce post !)


Sylvain M.

Hors ligne

 

Pied de page des forums

Powered by FluxBB