2010-12-01 20 views
8

Je souhaite renvoyer une seule ligne avec une liste de valeurs séparées par des virgules à partir d'une requête renvoyant plusieurs lignes dans Oracle, ce qui a pour effet d'aplatir les lignes renvoyées dans un une seule rangée.Equivalent aux fonctions array()/array_to_string() de PostgreSQL dans Oracle 9i

Dans PostgreSQL cela peut être réalisé à l'aide du tableau et array_to_string fonctionne comme ceci:

Compte tenu de la table "personnes":

id | name 
--------- 
1 | bob 
2 | alice 
3 | jon 

SQL:

select array_to_string(array(select name from people), ',') as names; 

sera de retour:

names 
------------- 
bob,alice,jon 

Comment pourrais-je obtenir le même résultat dans Oracle 9i?

Merci,

Matt

+0

Merci pour l'aide les gars, j'ai fait un peu plus de recherche et j'ai trouvé que cette réponse a fait l'affaire pour moi: http://stackoverflow.com/questions/468990/how-can-i-combine-multiple- rows-into-a-délimité-délimité-dans-oracle/4027064 # 4027064 – walkermatt

Répondre

5

Tim Hall a la collection définitive de string aggregation techniques in Oracle.

Si vous êtes coincé sur 9i, ma préférence personnelle serait de définir un agrégat personnalisé (il y a une mise en œuvre de string_agg sur cette page) de telle sorte que vous auriez

SELECT string_agg(name) 
    FROM people 

Mais vous devez définir une nouvelle fonction STRING_AGG. Si vous devez éviter de créer de nouveaux objets, il existe d'autres approches, mais dans 9i, elles vont être plus désordonnées que la syntaxe de PostgreSQL.

+0

+1 et merci pour le pointeur. M. Hall a une tonne de choses sur son site! – DCookie

1

Dans 10g je préfère nettement l'option COLLECT mentionnée à la fin de l'article de Tim.

La bonne chose à propos de cette approche est que la même fonction sous-jacente (qui accepte la collection comme argument), peut être utilisé à la fois comme un agrégat et en fonction multiset:

SELECT deptno, tab_to_string(CAST(MULTISET(SELECT ename FROM emp 
WHERE deptno = dept.deptno) AS t_varchar2_tab), ',') FROM dept 

Cependant, dans 9i qui est indisponible. SYS_CONNECT_BY_PATH est sympa parce que c'est flexible, mais il peut être lent, alors faites attention.