String splitten und tabelle dynamisch aufbauen

DBinteressent

Neuer Benutzer
Beiträge
1
Hallo liebe Comunity,

ich habe eine Tabelle die ungefähr so aussieht:

Column1(zusammengesetzter String).......Column_AnzahlStrings

String1_String2............................................. 2
String3_String4_String5...............................3
String6............................................................1
String7_String8_String9_String10..............4

Ich möchte mir aus dieser Tabelle folgende Tabelle aufbauen

Column1.......Column2........Column3........Column4
String1...........String2
String3...........String4...........String5
String6
String7...........String8...........String9............String10

Die zusammengesetzten Strings werden immer durch das '_' getrennt

Ich möchte für die Umsetzung keine Funktionen verwenden also dachte an sowas in der Art:
SELECT IF(
LOCATE('_', `Column1`) > 0,
SUBSTRING(`Column1`, 1, LOCATE('_', `Column1`) - 1),
`Column1`
) AS ColumnString

da man die Anzahl der Teilstrings vorher nicht weiß müsste man sich mit 'max' den höchsten Wert der Spalte 'Column_AnzahlStrings' ausgeben lassen und an hand dessen die Anzahl der Spalten erstellen und darunter die jeweiligen Strings einordnen.

Hat jemand eine Idee wie man das umsetzen könnte?

Hoffe ich habe mich einigermaßen verständlich ausgedrückt.

Vielen Dank schon mal für eure Bemühungen.

Viele Grüße
Mathias
 
Zuletzt bearbeitet:
Werbung:
Deine Ursprungstabelle ist schon mal redundant, die Anzahl der Strings, die durch _ getrennt sind, ist trivila berechenbar:

Code:
test=# select * from strings ;
  s   
----------------------------------
 string1_string2
 string3_string4_string5
 string6
 string7_string8_string9_string10
(4 Zeilen)
test=*# select *, 1+length(regexp_replace(s,'[^_]','','g')) from strings ;
  s  | ?column?
----------------------------------+----------
 string1_string2  |  2
 string3_string4_string5  |  3
 string6  |  1
 string7_string8_string9_string10 |  4
(4 Zeilen)

Das dann zu splitten in eine Tabelle mit N spalten bekommst nur via dynamisch erzeugten SQL hin, nicht mit einem simplen SQL. Davon abgesehen ist das, was Du vorhast, offensichtlich Beleg eines falschen Weges, den Du gehst. Was ist das Ziel der Übung?

Du kannst den String trivial in eine Tabelle splitten:

Code:
test=*# select regexp_split_to_table(s,'_') from strings ;
 regexp_split_to_table
-----------------------
 string1
 string2
 string3
 string4
 string5
 string6
 string7
 string8
 string9
 string10
(10 Zeilen)

test=*#

Vielleicht reicht das ja schon.

PS.: ich verwende PostgreSQL. Nicht alles, was ich oben gezeigt habe, wird direkt in MySQL gehen. Vermutlich eher wenig.
 
Werbung:
Du hast eine Lösung schon selbst genannt, du musst mit Funktionen wie substring() arbeiten und deinen Text mehrfach kürzen. Ich kann dir gleich sagen das das sehr sehr viel schreibarbeit und unübersichtlich sein wird, aber es geht.

Andere Lösungen sind unter MySQL nicht machbar, ich kenne keine. Meine Empfehlung: Neues, vernünftiges Tabellendesign und das ganze per Schleife durchgehen und migrieren. Idealerweise auch in einer anderen DB.
 
Zurück
Oben