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 !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Le GeoRezo vous souhaite une bonne année 2020 !

voeux2020

#1 Wed 25 September 2019 11:58

tevrard
Membre
Date d'inscription: 23 May 2016
Messages: 241

Duplication de lignes en fonction des valeurs d'un champ

Bonjour, j'ai une table de la forme

"id"; "pays"
"1";"BE,LU,PT,CH,BJ"
"2";"DE,AT,BE,ES,IT,GB"
"3";"CH"
"4";"CH"
"5";"DE,BE,ES,IT"


Et je souhaite arriver à une table où la clé serait (id, pays) soit

1;BE
1;LU
...
5;ES
5;IT


Je ne vois pas trop comment construire ma requête, si vous pouviez me donner des pistes...

PS : je dispose d'une table de référence "ref_pays" qui liste tous les codes pays
J'utilise PG 9.2

Dernière modification par tevrard (Wed 25 September 2019 11:59)

Hors ligne

 

#2 Wed 25 September 2019 12:30

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 983

Re: Duplication de lignes en fonction des valeurs d'un champ

Salut,

Code:

SELECT 
    id, regexp_split_to_table(valeur, '\s*,\s*') as pays
FROM
    ma_table
;

https://www.postgresql.org/docs/current … tring.html

Dernière modification par tumasgiu (Wed 25 September 2019 13:10)

Hors ligne

 

#3 Wed 25 September 2019 14:45

tevrard
Membre
Date d'inscription: 23 May 2016
Messages: 241

Re: Duplication de lignes en fonction des valeurs d'un champ

Merci !

Hors ligne

 

#4 Thu 26 September 2019 11:34

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 983

Re: Duplication de lignes en fonction des valeurs d'un champ

De rien.

C'est d'ailleurs un raccourci.
La "vraie" requête est plus dans ce genre là :

Code:

SELECT
    id, pays
FROM
    ma_table
CROSS JOIN LATERAL 
      regexp_split_to_table(valeur, '\s*,\s*') as pays
;

La clause LATERAL demande à Postgresql
d'évaluer l'expression à sa droite pour chaque élément de
la relation gauche de la jointure et d'effectuer
la jointure sur le résultat, (ici, donc tout les éléments
renvoyées par l'expression sont jointes puisqu'on utilise
un CROSS JOIN)

On peut dire qu'il effectue la jointure pour chaque élément
d'une relation avec une table "virtuelle" dépendant de l’élément en cours,
c'est à dire qu'un membre de la relation sert à produire la table virtuelle
(ici la colonne valeur).

La table virtuelle peut ne pas être dépendante des éléments,
exemple avec generate_series :

Code:

CREATE TEMP TABLE foo(bar) AS (SELECT 1 UNION SELECT 2);

SELECT 
    bar,
    i
FROM
    foo
CROSS JOIN LATERAL
   generate_series(1, 2) i
;

--Renvoie
--1; 1
--1; 2
--2; 1
--2; 2

Dernière modification par tumasgiu (Thu 26 September 2019 11:38)

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |