# mysql substring trennen und in neues feld schreiben?



## Deletemaster (26. April 2005)

hallo zusammen
folgendes problem:
ich habe ein feld, in dem steht:
030/ 1234567
ich möchte
Feld1 = 030
Feld2=1234567

ich habe es mit substring versucht:
update table
set Feld2=
select substring(Feld1,'/',10)
from table;

aber dies funktioniert leider nicht...
Kann mir bitte jemand helfen?
Dafür gibt es bestimmt eine query?
Danke für eure hilfe...


----------



## hpvw (27. April 2005)

Substring erwartet kein Zeichen, sondern eine Position. Die Position könntest Du mit Locate (auch bei obigem Link beschrieben) ermitteln, dazu noch mit Length arbeiten und ggf. +- 1, manchmal muss das sein.
Ich glaube auch, ein Subselect ist hier gar nicht nötig. Ungefähr so könnte es aussehen:

```
update [table] set 
Feld2=substring(Feld1,locate('/',Feld1),length(Feld1)-locate('/',Feld1)),
Feld3=substring(Feld1,1,locate('/',Feld1))
```
Wenn es nicht passt ggf. Korrekturwerte addieren, ich mach das immer mit try'n'error (und MySQL scheint auch noch bei 1 mit dem Zählen zu beginnen und nicht mit 0) oder noch mal posten was dabei rauskommt.

Gruß hpvw

PS: Bitte SQL-Statements in Code-Tags schreiben, das macht sie lesbarer.

EDIT: Schau Dir mal diesen Beitrag von Tim an. Das ist vielleicht noch etwas eleganter und kommt Deinem Versuch am nächsten.


----------



## Nico Graichen (27. April 2005)

@ Deletemaster
ich hab mal eine Frage an dich:
Weißt du eigentlich was du willst?
Erst suchst du eine Möglichkeit deine Strings aus zwei Feldern zu verketten und jetzt willst du sie wieder trennen. Wie denn nun?


----------



## Deletemaster (27. April 2005)

@niggo
Ich benötige einfach verschiedene Möglichkeiten!
wenn ich verschiedene Excel-Quellen habe, in denen di Daten in verschiedenen Formen vorliegen, benötige ich auch verschiedene Querys!
In einer Tabele steht 
Zelle1: vorwahl 030
Zelle2: telefon 1234567

in einer anderen Tabelle steht:
Zelle1: vorwahl+telefon 030-1234567
oder: (030) 1234567
oder: 030/ 1234567
da ich als ausgabe feld1 vorwahl feld2 telefon benötige 
brauche ich diese querys
weiterhin benötige ich ein weiters feld (interne zwecke) mit vorwaltelefon
denn diese sind einzigartig und nur einem anschluss zuzuordnen... na....?
Wenn ich nun verschieden Excel-Tabellen habe mit jeweils mehreren tausen zeilen,
kann es vorkommen, das sich datensätz wiederholen, aber die Schreibweise kann unterschiedlich sein.
Aus diesem Grund benötige ich meine Abfragen, um somit mit DISTINCT doppelte einträge zu filtern.

Ich hoffe ich konnte deine Frage beantworten!


----------



## Deletemaster (27. April 2005)

@hpvw
ich habe mit dem substring ein wenig rumexperimentiert aber leider nicht mein gewünschtes Ergebnis erziehlt:
mysql> UPDATE adr_test2
    -> SET feld3=substring(feld1,locate('/',feld1),length(feld1)+locate('/',feld1)),
    -> feld2=substring(feld1,1,locate('/',feld1));
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from adr_test2;
+--------------+-------+-----------+
| feld1        | feld2 | feld3     |
+--------------+-------+-----------+
| 030/1234567 | 030/  | /1234567 |
+--------------+-------+-----------+
1 row in set (0.00 sec)
wie du siehst ist der SLASH immer noch vorhanden, wenn ich mit + oder - rumexperimentiere
dann fehlen mit Zeichen von der Telefonnummer
Mein gewünschtes Ergebnis soll sein:
+--------------+-------+-----------+
| feld1        | feld2 | feld3     |
+--------------+-------+-----------+
| 030/1234567 |030|1234567|
+--------------+-------+-----------+

Hast du hierfür vielleicht eine Lösung?
Ich habe es auch mit SUBSTRING_INDEX versucht, aber hier muss ich eine bestimmte Anzahl von Zeichen vorgeben, die aber unbekannt ist

Vielleicht hast du ja noch eine Idee?
Danke


----------



## hpvw (27. April 2005)

Wenn ich mir Deine Ergebnisse anschaue, dann ist bei Feld2 am Ende noch ein Zeichen zuviel, der Slash. Das heisst, der herauszukopierende Char muss ein Zeichen weniger mitnehmen. Damit müsste der letzte Parameter von Substring um 1 reduziert werden.
Bei Feld3 ist am Anfang noch ein Zeichen zuviel, also muss die Position um 1 erhöht und die Länge um 1 reduziert werden. 
Das mit der Länge kannst Du allerdings erstmal ignorieren.
Du hast auch "Glück", dass MySQL bei zu langen Angaben am Ende des Char aufhört. Der Genauigkeit halber würde ich das + trotzdem in ein - wandeln.
Somit müßte folgendes Query funktionieren:

```
UPDATE adr_test2
SET
feld3=substring(feld1,locate('/',feld1)+1,length(feld1)-locate('/',feld1)),
feld2=substring(feld1,1,locate('/',feld1)-1);
```
Manchmal hilft es, sich so einen String auf kariertem Papier in die Kästchen zu malen, in der Zeile darunter die Zeichenpositionen und das ganze dann von Hand durchzuspielen.

Gruß hpvw


----------



## Deletemaster (27. April 2005)

Genau so funktioniert es...
Danke für den Tipp


----------

