Anmelden

View Full Version : Mysql Datenbank Feld in mehrere Felder aufsplitten



jagr2510
09-05-11, 15:00
Hallo,

hier ein kleiner Ausschnitt aus der relevanten Tabelle:

id = 0000000006
actiontype = 1
datafield = 90000,Manuel

um das `datafield`in zwei Felder aufzusplitten habe ich folgendes Script geschrieben:

Select `actiontype`,
case when instr(`datafield`, ',') > 0
then substr(`datafield`, 1, instr(`datafield`, ',')-1)
else ' '
end as user_id
,
case when instr(`datafield`, ',') > 0 and instr(`datafield`, ',') < length(`datafield`)
then substr(`datafield`, instr(`datafield`, ',') + 1)
else `datafield`
end as first_name
from `interfacetbl`
WHERE actiontype = 1

Die Frage ist, wie splitte ich ein Feld in vier oder mehrere Felder auf, wie zum Beispiel:

id = 0000000006
actiontype = 1
datafield = 90000,Manuel,Weis,printcarrier.com

Die vier neuen Felder mit Inhalt:

user_id = 90000
first_name = Manuel
last_name = Weis
company = printcarrier.com

Vielleicht fällt euch ja etwas dazu ein, ich würde mich sehr über hilfreiche Beiträge freuen!

P.S.: Ich brauche lediglich einen Select den ich dann in eine Prozedur schreiben werde.

Fuerchau
09-05-11, 15:09
Also ich denke, im Select selber wird es nicht gehen.
Da du aber sowieso eine Prozedur schreiben willst, kannst du das dann in einer eigenen Schleife durchführen.
INSTR (SQL-Standard POSSTR) unterstützen meist auch einen Startwert.

Je nach dem, welche Sprache dir für die Prozedur zur Verfügung steht, kannst du dann den sprachspezifischen Befehl (falls vorhanden) "split(Feld, Delimiter)" verwenden, der dir dann ein Array zurückliefert.

jagr2510
09-05-11, 15:40
Vielen Dank für die rasche Antwort! Es geht bei der ganzen Sache um den Connect zischen einem Shop-Backend und einem CRM. Die Daten sollen vom Shop-Backend ins CRM laufen.
Dies geschieht allerdings nicht direkt, sondern über eine Interface-Tabelle. Zum jeweiligen actiontype wie z.B. 1 für "Add or Update Kundendaten" werden alle relevanten Kundendaten vom Backend über ein PHP-Script in das `datafield` der Interfacetabelle geschrieben. Anschließend gibt es zwei Möglichkeiten, entweder ich erstelle einen View oder eine Prozedur, auf die ich mit meiner Taskverwaltungssoftware zugreife. Hierfür muss ich wie erwähnt das `datafield` splitten.
Wie ich die Werte trenne ist eigentlich egal, wichtig ist jedoch das alles auf Datenbankebene stattfinden sollte.
Ich bin mit SQL noch nicht so bewandert, wie müsste denn eine mögliche Schleife für diesen Fall in MySQL aussehen?

Fuerchau
09-05-11, 16:33
Das Problem hier ist die Variabilität.

Liegen immer 4 Felder vor ?
Kann der INSTR einen Startwert vorgeben ?
Dazu kenne ich den MySQL-Dialekt nicht.

Das 1. Feld
substr(Feld, 1, instr(1, Feld, ',')-1)

Das 2. Feld
substr(Feld, instr(1, Feld, ',')+1, instr(instr(1, Feld, ',')+1, Feld, ',') - instr(1, Feld, ',') - 2)

usw.

Kann der Bereitsteller der Daten das denn nicht in fest formatiert, also mit fester Länge je Einzelwert zur Verfügung stellen ?

Alternativ kannst du ggf. eine SQL-Function erstellen:

create Function MySplit (Index Integer, Feld Varchar(nn))
returns varchar(nn)

und dann über eine Do-Schleife die Werte zerlegen.

Dann kannst du die Funktion im Select verwenden:

select MySplit(1, Feld), MySplit(2, Feld) ...

jagr2510
09-05-11, 17:13
Es liegen immer 4 Felder vor und die Reihenfolge ist immer die Gleiche:
Wert 1 entspricht immer user_id
Wert 2 entspricht immer first_name
Wert 3 entspricht immer last_name
Wert 4 entspricht immer company

`datafield`= user_id,first_name,last_name,company

Ich bin mit SQL noch nicht so bewandert, wie müsste denn eine mögliche Schleife für diesen Fall in MySQL aussehen?

BenderD
10-05-11, 08:58
... routines (stored proocedures und user defined functions) gibt es bei MySql ab Version 5 - und da gibt es auch ein Handbuch, Tutorials und Beispiele im Web (Mr. google hilft manchmal ungemein!).

... instr(), das du ja bereits kennst, liefert immer das erste vorkommen des Suchstrings, das Ding kann man also auch schachteln.

das sollte eigentlich reichen, ein wenig darf ein Frager auch noch selber machen.

D*B

PS: so einen Krampf vermeidet man durch ein Minimum an Design in seinen Anwendungen!!!