Vous n'êtes pas identifié(e).

#1 10/03/2014 11:06:18

Geo-x
Membre

Faire un replace avec des valeurs d'une autre table

Bonjour @ tous.

Je sais que je vous sollicite beaucoup en ce moment, mais si vous étiez moins bon dans vos réponses il est fort probable que je vous demande moins de choses ;-)

Aujourd'hui, j'essaie une fois de plus d'innover en voulant réaliser un relace avec des valerurs sources et destination issues d'une autre table, je m'explique :

1- J'ai une table1 qui contient une liste d'id associée à un nom


id | nom
-----------------
1 | coucou
2 | chouette
3 | hibou

2- J'ai une table2 qui contient un champ varchar[] qui contient le résultat de cette table 1

id  | champ1
----------------
10 | {3,2}
20 | {3,1,2}

3- Ce que je souhaite faire, c'est faire apparaitre avec ma requête les vrais valeurs (issues de la table1) associées au numéro de la table2 :


id  | resultat
-------------------------------
10 | hibou,chouette
20 | hibou,coucou,chouette

Pour ça, j'ai déjà testé sur un numéro en particulier :

select replace(replace(replace(array(SELECT unnest(champ1) from table2 where id=10)::varchar,'{',''),'}',''),foo.id,foo.nom) FROM (SELECT id::varchar,nom FROM table1)foo; 

Le problème c'est que le résultat apparait sous la forme suivante :

id  | resultat
-------------------------------
10 | "hibou,2"
10 | "1,chouette"

Est-ce que vous avez une solution pour ce genre de problèmatique ?

Par avance merci de votre aide.

Geo-x

Hors ligne

#2 10/03/2014 12:52:42

rjuju
Administrateur

Re : Faire un replace avec des valeurs d'une autre table

Bonjour,

pourquoi varchar[] et pas integer[] ?

sinon, cette requête devrait marcher :

SELECT t2.id, string_agg(t1.nom,',')
FROM (SELECT id, unnest(champ1) as ref FROM table2) t2
JOIN table1 t1 ON t2.ref::integer = t1.id
group by 1;

Hors ligne

#3 10/03/2014 13:04:08

Geo-x
Membre

Re : Faire un replace avec des valeurs d'une autre table

Bonjour rjuju.

En fait, c'est la configuration de notre logiciel qui impose ce genre de contrainte par rapport au type de champ.

Sinon la requête est parfaite et très intéressante d'un point de vue technique !

Ceci m'emmène à une autre question, quand vous faites "group by 1" ça veut dire qu'il y a un GROUP BY sur le premier champ appellé dans le SELECT ?

Hors ligne

#4 10/03/2014 15:41:20

rjuju
Administrateur

Re : Faire un replace avec des valeurs d'une autre table

Oui, c'est ça.

Ce n'est d'ailleurs pas forcément une bonne chose à faire pour la requête finale. Vous pouvez donc remplacer par "group by t2.id".

Hors ligne

Pied de page des forums