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

Advertisements
This entry was posted in howtos and tagged , , , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s