SQL String split nach Kommata

MK_CGN

Benutzer
Beiträge
5
Hallo Foren Gemeinde,
folgende Fragestellung: Ich habe ein MYSQL Datenbankfeld, in dem Komma getrennt Werte enthalten sind. Ich weiß, dies ist so nicht konform, aber lässt sich auf Grund der verwendeten Vorgaben durch den Hersteller nicht anpassen.

In dem Feld "Anschrift" in der Tabelle "Stammdaten" ist folgender Syntax vorhanden:

Postleitzahl Ort, Strasse Hausnummer

LTRIM(SUBSTRING(Anschrift, CHARINDEX(',', Anschrift) + 1, LEN(Anschrift))) + Char(13) + Char(10) + RTRIM(SUBSTRING(Anschrift, 1, CHARINDEX(',', Anschrift) - 1)))) AS Adresse

Dieser liefert mir auch ein korrektes Ergebnis, so wie gewünscht.

Jetzt gibt es aber auch Einträge in dem Feld "Anschrift" mit folgendem Syntax:

Land, Postleitzahl Ort, Strasse Hausnummer

Dann funktioniert der oben genannte String natürlich nicht, da er nur nach einem Komma gen String trennt.

Also habe ich folgenden Syntax erstellt.

reverse(substring(REVERSE(Anschrift), 1, charindex(',', REVERSE(Anschrift)) - 2)) + Char(13) + Char(10) +
substring(Anschrift, charindex(',', Anschrift) + 2, charindex(',', Anschrift, charindex(',', Anschrift) + 2) - charindex(',', Anschrift) - 2) + Char(13) + Char(10) +
SUBSTRING(Anschrift, 1, charindex(',', Anschrift) - 1))) AS Adresse

Dieser funktioniert für den zweiten Syntax allerdings nicht für den ersten, da erhalte ich eine Fehlermeldung und der String wird nicht ausgegeben :-( Wie kann ich dies nun so programmieren, das beide Fälle angewendet werden? Über Eure Hilfe würde ich mich freuen, da ich hier echt nicht mehr weiter komme.

Danke vorab und viele Grüße
Marc
 
Werbung:
Sorry ist schon richtig hier, meinte MSSQL und nicht MYSQL. Die Software ist definitiv nicht schrott, kann nur nicht angepasst werden... Und helfen tut Dein Kommentar auch nicht wirklich
 
Nun ja, es IST Schrott, mehrere Dinge in einem Feld zu speichern. Morgen kommt noch die Telefonnummer dazu, übermorgen die email-Adresse und nächste Woche der Rufname des Haustieres.
 
Beginnend mit SQL Server 2016 gibt es die Funktion string_split() mit der Du das machen kannst. Diese wandelt einen String in Datensätze um. Lies Dir die Beispiele im Handbuch durch, die sollten auf Dein Problem passen.

Wenn Du noch eine ältere Version verwendest, dann, wird's etwas schwieriger.
Schau Dir mal die Lösungen auf Stackoverflow an - die Frage kommt da ständig (manchmal frage ich mich warum die Leute die so ein Modell verbrochen haben, nicht auch gezwungen werden damit zu arbeiten)

Grundsätzlich ist es nicht ganz einfach mit einem verkorksten Datenmodell so etwas elegant zu lösen (zumindest wenn man Postgres nicht verwenden darf :rolleyes: )
 
@castorp : Danke für Deine Hinweise. Es ist leider ein SQL Server 2008 R2. Somit fällt die erste Lösung aus :-( Ich schaue mir den anderen Link mal in Ruhe später an.

Wenn jemand noch eine Lösung weiß, würde ich mich über Unterstützung freuen.
 
Also wenn es wirklich nur die beiden Fälle gibt dann kannst du es mit deinem Code und einem CASE machen:
Code:
WITH tabelle(Anschrift) AS (
   SELECT   'Postleitzahl Ort, Strasse Hausnummer'
   UNION ALL
   SELECT   'Land, Postleitzahl Ort, Strasse Hausnummer'
   )
SELECT   (   CASE
           WHEN   datalength(Anschrift)-datalength(replace(Anschrift,',','')) = 1
           THEN   LTRIM(SUBSTRING(Anschrift, CHARINDEX(',', Anschrift) + 1, LEN(Anschrift))) + Char(13) + Char(10) +
                   RTRIM(SUBSTRING(Anschrift, 1, CHARINDEX(',', Anschrift) - 1))
           WHEN   datalength(Anschrift)-datalength(replace(Anschrift,',','')) = 2
           THEN   reverse(substring(REVERSE(Anschrift), 1, charindex(',', REVERSE(Anschrift)) - 2)) + Char(13) + Char(10) +
                   substring(Anschrift, charindex(',', Anschrift) + 2, charindex(',', Anschrift, charindex(',', Anschrift) + 2) - charindex(',', Anschrift) - 2) + Char(13) + Char(10) +
                   SUBSTRING(Anschrift, 1, charindex(',', Anschrift) - 1)
           ELSE   NULL
           END ) AS Adresse
FROM   tabelle
 
Werbung:
Zurück
Oben