Diesen Wirrwarr möchte ich jetzt mit einer Abfrage bei jedem KOMMA und jedem SEMIKOLON trennen und den Inhalt jeweils in eine neue Spalte in der selbe Zeile schreiben.
Ich möchte quasi das erreichen, was ich in Excel über die Funktion “Text in Spalten” erzielen kann.
Wie realisiere ich das in postgre SQL?
Ich benutze übrigens nicht das pstgre SQL plugin sondern den ganz normalen Abfragegenerator.
Die Anzahl der durch Komma oder Semikolon getrennten ‘Felder’ ist variabel, also in jeder Zeile unterschiedlich, ja? Damit würden dann je Zeile unterschiedlich viele Spalten entstehen, ja?
Falls ja: vergiß es, Du wirst so nicht weiterkommen.
Weiter weiß ich nicht, da ich weder die Funktion Rechts oder Links in postgre SQL finde, noch weiß wie das überhaupt gehen soll, dass er jetzt das nächste Komma oder Semikolon sucht und diesen Inhalt dann in eine neue Spalte packt.
Was Du meiner Meinung nach brauchst ist eine Funktion, die in einer Schleife durch Deine jetzige Tabelle durchgeht und die Zerlegung macht. Diese Funktion erstellt dann eine Tabelle in einem normalisierten Datenmodell.
Ich hab jetzt grad weder Zeit noch Lust, Dir das zu machen. Im netz findest Du aber massig Beispiele für sowas, schon in der Doku zu PostgreSQL / plpgsql.
Kannst du mir vielleicht noch einen Hinweis geben unter was ich da genau schauen muss? Habe bisher dort noch nicht mal eine Funktion LEFT oder RIGHT gefunden.??
MIt split_part hab ich auch schon versucht:
split_part(annotation, ‘,’,1),
Damit bekomme ich halt alles Links vom ersten Komma in eine Spalte. Die Schleife, die ich brauche um durch alles zu iterieren, ist allerdings etwas von dem ich absolut keine Ahnung habe.
Muss ich mir wohl irgendwie externe Hilfe holen oder gucken ob das hier irgendjemand weiß. Ich hab sonst eig nur mit Excel zu tun und brauche SQL nur für normale Abfragen aber nicht um dort komplexe Formelarbeiten aus Excel zu erledigen.
test=*# select * from foo;
i | t
---+----------------
1 | eins
2 | eins,zwei,drei
3 | drei
4 | drei,vier
(4 rows)
Mal als Ausgangstabelle. Nun eine simple Funktion:
create or replace function my_foo(out i int, out t text) returns setof record as $$
declare
r record;
c int;
begin
for r in select * from foo loop
i:=r.i;
c:= length(r.t) - length(replace(r.t,',',''));
while (c >= 0 ) loop
t:=split_part(r.t,',',c+1);
c:=c-1;
return next;
end loop;
end loop;
end;
$$ language plpgsql;
ergibt:
test=*# select * from my_foo();
i | t
---+------
1 | eins
2 | drei
2 | zwei
2 | eins
3 | drei
4 | vier
4 | drei
(7 rows)
So, das baust halt aus, bis das auf Deinen Zweck paßt.
Oder: hostest das bei uns und gibst es mir in Auftrag
Danke Andreas, werde mir das morgen mal anschauen auf Arbeit und schauen ob ich damit was hinbekomme. Glaube allerdings nicht, da ich deinen Code nicht in den Abfrageeditor Code umwandeln kann, benutze ja nicht dieses psql interface…
Danke dafür aber was genau ist “unnest” und wo in der formel muss meine Quellspalte (annotation) rein? Mit der Abfrage geht der mir doch abern icht jedes Komma entlang und schreibt die Inhalte zwischen zwei Kommata in separate Spalten?
Hmm, hatte mit arrays noch nie was zu tun und kann mir darunter auch nichts vorstellen.
Bei einer Funktion wie “strpos(string, substring)”, ist meine Annotation der string und mein “,” der substring…
Das finde ich aber bei dem unnest() und string_to_array() nirgends wieder, daher die Frage wohin das annotation muss? kann ja schlecht annotation_to_array() draus machen, oder?
Ist das echt soooo schwer? string_to_array() macht was? Es macht aus einem String ein ARRAY. Dazu teilt es den übergebenen String an dem übergebenen Trennzeichen auf und gibt ein ARRAY zurück.
unnest() macht laut Beschreibung: “expand an array to a set of rows”.