#1 Wed 25 September 2019 11:58
- tevrard
- Participant assidu
- Date d'inscription: 23 May 2016
- Messages: 323
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: 1218
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
- Participant assidu
- Date d'inscription: 23 May 2016
- Messages: 323
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: 1218
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; 2Dernière modification par tumasgiu (Thu 26 September 2019 11:38)
Hors ligne


