#1 Wed 25 September 2019 11:58
- tevrard
- Participant assidu
- Date d'inscription: 23 May 2016
- Messages: 320
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: 1160
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: 320
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: 1160
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