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é ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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)

En 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)

En ligne

 

Pied de page des forums

Powered by FluxBB