oracle group concat

oft habe ich mir schon die frage gestellt, wie der einfachste weg ist, mehrere strings, die aus einem SQL statement in mehreren rows kommen, zu einem string in einer row zusammenzufassen. im mysql gibt es die funktion group_concat(), die in oracle aber leider nicht vorkommt.

das problem im detail ist, dass das statement für ein dataset:

select
   'A' as text
from
   dual
union
select
   'B' as text
from
   dual

folgendes liefert:

text

A
B

…, man aber manchmal den text in einem einzigen string in einer row und nicht in mehreren rows zurückbekommen will, also “A B”

die lösung dafür ist entweder mit plsql prozeduren zu arbeiten (was ich bis jetzt immer gemacht habe) oder auf hierarchische statements zurückzugreifen. folgendes knappes statement liefert die lösung

select
   ltrim(max(sys_connect_by_path(text, ' ')), ' ')
from
(
   select
      text,
      rownum as rn
   from
   (
      // dataset, z.b. siehe oben
   )
)
start with rn = 1
connect by prior rn=rn-1

eine etwas komplexere lösung ist im tom kyte blog zu finden