Inhalt der Zeilen concatenieren (ORACLE SQL)

Hallo Community,

ich möchte der Text der Zellen einer Tabellen concatenieren.
Beispiel - Tabelle mit 2 Spalte (ID und TEXT):

ID | TEXT

1 | ein //(Kommentar) 1. Zeile
1 | Text // 2. Zeile
3 | noch // 3. Zeile
3 | ein Text // 4. Zeile

als Ergebnis soll die Tabelle( oder View) (ine Spalte nur):

ERGEBNIS

1 ein Text //(Kommentar) 1. Zeile
3 noch ein Text // andere Zeile

Wie kann man das programmieren?

Vielen Dank!!!

Denis

Hi Denis,
interessantes Problem :wink:
Reicht ein Programm, welches dies einmal Ausführt ?
Sollen die Daten in der Originaltabelle verändert werden ?
Kann es auch beim Einstellen der Daten übernommen werden ?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Doppelposting ‚DB allg‘ (meine Re. steht dort) owT
kein Text!

Hallo Denis,
ich habe das so gelöst:
TABLLE:
ID TEXT


1 Hallo // remark
1 Frank // remark2
3 hier // remark3
3 ist der // remark4
3 Text // remark5

create or replace function get_text(v_id number)
return varchar2 is
v_text varchar2(256);
v_return varchar2(256);
v_remark varchar2(256);
cursor c1 is select * from text_id
where id = v_id;
begin
v_text := ‚‘;
v_return := ‚‘;
v_remark := ‚‘;
for curs in c1 loop
v_text := substr(curs.text,1,instr(curs.text,’//’)-1);
v_return := v_return ||’ ‚||v_text;
v_remark := v_remark || substr(curs.text,instr(curs.text,‘//’)+2, length(curs.text));
end loop;
v_return := v_return || ‚//‘ || v_remark;
return v_return;
end;
/

select id, get_text(id) text from text_id
group by id, get_text(id);

Ausgabe:
ID TEXT


1 Hallo Frank // remark remark2
3 hier ist der Text // remark3 remark4 remark5

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Frank!

Ich will dir ja nicht auf den Schlips treten aber: Deine Lösung tut zwar etwas, das man eventuell als Lösung des Problems für einen speziellen Fall durchgehen lassen kann, aber ohne weitere Angaben des Fragestellers kommen wir mA hier nicht zum Schluss.

Selbst wenn deine angebotene Lösung genau der Intention entsprechen würde, bleibt immer noch das Problem, dass das Ergebnis des Funktionsaufrufs nicht zwangsläufig das von dir angegebene ist: Da der Cursor keine „order by“-Klausel enthält ist auch die Reihenfolge beim Einlesen der Sätze nicht definiert. Die von Dir angegebene Funktion liefert also mit gleicher Wahrscheinlichkeit:

 ID TEXT
---------------------------------------------------
 1 Frank Hallo // remark2 remark
 3 ist der hier Text // remark4 remark3 remark5

oder (wobei sich hier die Vertauschung der IDs ja wenigstens noch leicht lösen ließe) (Anmerkung: der GROUP BY im select macht zumindest auf Oracle einen impliziten ORDER BY, das ist allerdings meines Wissens nicht im ANSI Standard enthalten und kann sich daher jederzeit ändern):

 ID TEXT
---------------------------------------------------
 3 ist der Text hier // remark4 remark5 remark3
 1 Frank Hallo // remark2 remark

Man müsste also noch nach dem Kommentar sortieren, das wird allerdings alles andere als trivial, wenn die Ausgangstabelle so aussieht:

 ID TEXT
--- ------------------------------
 1 Hallo // remark
 1 Frank // Anmerkung 2
 3 hier // Kommentar10
 3 ist der // Kommentar011
 3 Text // remark: gehört gleich nach "Kommentar 011"!

Ich bleibe also bei meiner Meinung (siehe http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…), dass das Problem mit den angegebenen Voraussetzungen nicht oder nur ungenügend lösbar ist.

Gruß,
Martin

Hallo Denis,
ich habe das so gelöst:
TABLLE:
ID TEXT


1 Hallo // remark
1 Frank // remark2
3 hier // remark3
3 ist der // remark4
3 Text // remark5

create or replace function get_text(v_id number)
return varchar2 is
v_text varchar2(256);
v_return varchar2(256);
v_remark varchar2(256);
cursor c1 is select * from text_id
where id = v_id;
begin
v_text := ‚‘;
v_return := ‚‘;
v_remark := ‚‘;
for curs in c1 loop
v_text := substr(curs.text,1,instr(curs.text,’//’)-1);
v_return := v_return ||’ ‚||v_text;
v_remark := v_remark ||
substr(curs.text,instr(curs.text,‘//’)+2, length(curs.text));
end loop;
v_return := v_return || ‚//‘ || v_remark;
return v_return;
end;
/

select id, get_text(id) text from text_id
group by id, get_text(id);

Ausgabe:
ID TEXT


1 Hallo Frank // remark remark2
3 hier ist der Text // remark3 remark4 remark5

hallo frank, hallo thebiest,

vielen dank für eure vorschläge und lösungen. da ich zum ersten mal hier gepostet habe, habe ich natürlich ein wenig für verwirung gesorgt, denn die tabelle sieht so aus:

ID | ZEILE-NR | TEXT

1 | 1 | ein
1 | 2 | Text
3 | 1 | noch
3 | 2 | ein Text

als Ergebnis soll die Tabelle( oder View) (order by ID ASC, ZEILE-NR ASC):

ID | ERGEBNIS

1 | ein Text
3 | noch ein Text