2010-12-08 5 views
0

Je souhaite créer une vue qui affiche des informations intéressantes sur les utilisateurs du système. Entre autres choses, mon DB a cette table qui a plusieurs rangées par utilisateur, s'étendant fondamentalement de 0 à 3 rangées. Chacune de ces lignes a un champ de chaîne appelé "nom", et j'aimerais que ma vue contienne toutes ces valeurs séparées par des virgules. Par exemple:Vues PostgreSQL: Aplatissement des enregistrements dans une colonne

UID Name Concatenation 
1  John A, C 
2  Jack B, C 
3  James 
4  Jill B 

Existe-t-il un moyen de sélectionner dans l'autre table dans cette colonne? J'utilise PostgreSQL mais cela me semble être une question SQL générique.

+0

Quelle était la table d'entrée? –

+0

duplication possible de [Comment concaténer les chaînes d'un champ chaîne dans un groupe PostgreSQL par 'requête?] (Http://stackoverflow.com/questions/43870/how-to-concatenate-strings-of-a-string- field-in-a-postgresql-group-by-query) –

Répondre

1

Voir ici:

How to concatenate strings of a string field in a PostgreSQL 'group by' query?

Vous devez définir une nouvelle fonction d'agrégation. La fonction exacte dépend de la structure de votre table, mais voici an example from the PostgreSQL forums:

CREATE AGGREGATE textcat_all(
     basetype = text, 
     sfunc  = textcat, 
     stype  = text, 
     initcond = '' 
); 

Vous pouvez utiliser ce nouvel agrégat dans votre requête. Par exemple:

SELECT partner.name, textcat_all(phones.number || ', ') 
     FROM partner LEFT JOIN phones ON partner.id = phones.partner_id 
     GROUP BY partner.name; 
0

vous pouvez utiliser une sorte d'agrégat par exemple de concaténation de chaîne:

create aggregate concat(basetype = text, 
         sfunc = textcat, 
         stype = text, 
         initcond = ''); 

select name, substring(concat(', '||value, 3) from t group by name; 

mais vous avez besoin 9.0 si vous souhaitez utiliser une clause order by dans l'ensemble

Questions connexes