MySQL: Nummer aus einem String extrahieren

Kategorie:
Entwicklung
mysql

Ich bin vor der Schwierigkeit gestanden, aus einem String die Nummer zu extrahieren um diese anschließend mit einer Tabelle zu joinen.

Nach langem Suchen/Probieren habe ich diese Lösung gefunden:

SELECT 
SUBSTRING(myWord, start, ende-start+2) ergebnis
FROM(
SELECT
myWord,
LEAST (#get first occurence of numbers 0-9, get lowest value --> start
IF (LOCATE('0',myWord) >0,LOCATE('0',myWord),999),
IF (LOCATE('1',myWord) >0,LOCATE('1',myWord),999),
IF (LOCATE('2',myWord) >0,LOCATE('2',myWord),999),
IF (LOCATE('3',myWord) >0,LOCATE('3',myWord),999),
IF (LOCATE('4',myWord) >0,LOCATE('4',myWord),999),
IF (LOCATE('5',myWord) >0,LOCATE('5',myWord),999),
IF (LOCATE('6',myWord) >0,LOCATE('6',myWord),999),
IF (LOCATE('7',myWord) >0,LOCATE('7',myWord),999),
IF (LOCATE('8',myWord) >0,LOCATE('8',myWord),999),
IF (LOCATE('9',myWord) >0,LOCATE('9',myWord),999)
) AS start,
(LENGTH(myWord) -
LEAST (#get first occurence of numbers 0-9 with string reversed, get lowest value
IF (LOCATE('0',REVERSE(myWord)) >0,LOCATE('0',REVERSE(myWord)), 999),
IF (LOCATE('1',REVERSE(myWord)) >0,LOCATE('1',REVERSE(myWord)), 999),
IF (LOCATE('2',REVERSE(myWord)) >0,LOCATE('2',REVERSE(myWord)), 999),
IF (LOCATE('3',REVERSE(myWord)) >0,LOCATE('3',REVERSE(myWord)), 999),
IF (LOCATE('4',REVERSE(myWord)) >0,LOCATE('4',REVERSE(myWord)), 999),
IF (LOCATE('5',REVERSE(myWord)) >0,LOCATE('5',REVERSE(myWord)), 999),
IF (LOCATE('6',REVERSE(myWord)) >0,LOCATE('6',REVERSE(myWord)), 999),
IF (LOCATE('7',REVERSE(myWord)) >0,LOCATE('7',REVERSE(myWord)), 999),
IF (LOCATE('8',REVERSE(myWord)) >0,LOCATE('8',REVERSE(myWord)), 999),
IF (LOCATE('9',REVERSE(myWord)) >0,LOCATE('9',REVERSE(myWord)), 999)
)
) AS ende#length of string - position of number reversed = end position of full string
FROM (
SELECT 'abc12341129deffa' myWord FROM dual
) position_check
) result

myWord ist der Wert den ich verarbeite.

Bei der Spalte "start" hole ich mit LOCATE die Position der Ziffern von 0 bis 9(wenn nicht vorhanden => 999). Anschließend lasse ich mir mit LEAST die niedrigste Position zurückgeben. Mit der Spalte "ende" mach ich das komplett gleiche, nur drehe ich den Wert vorher mit REVERSE um. Danach berechne ich die Position im neuen neuen String:

Länge des Wertes - Position des Strings von hinten zählend + 2 (als Korrekturwert)

Mit SUBSTRING(str, pos, length) gebe ich abschließend die Zahl zurück.

15. Juli 2013
Christoph Müller