Sie könnten REGEXP_REPLACE
verwenden :
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Ausgabe
7654321
Dieser reguläre Ausdruck sucht nach einer Zeichenfolge, die mit einer bestimmten Anzahl von Ziffern beginnt (^\d+
) gefolgt von einigen nicht-stelligen Zeichen ([^\d]+
) und dann eine weitere Zifferngruppe ((\d+)
) gefolgt von einigen Zeichen bis zum Ende der Zeichenfolge (.*$
). Der ()
um die zweite Zifferngruppe herum ergibt sich daraus eine einfangende Gruppe, auf die wir dann im Ersetzungsstring mit \1
verweisen können . Seit REGEXP_REPLACE
nur die Teile des Strings ersetzt, die mit der Regex übereinstimmen, ist es notwendig, eine Regex zu haben, die mit dem Ganzen übereinstimmt string, um sie nur durch die gewünschten Daten zu ersetzen.
Aktualisieren
Wenn möglicherweise Zeichen vor dem ersten Ziffernsatz stehen, sollten Sie die Regex in
ändern^[^\d]*\d+[^\d]+(\d+).*$
Aktualisierung 2
Wenn es möglich ist, dass am Anfang nur eine Zahlengruppe steht, müssen wir das Abgleichen des ersten Teils optional machen. Wir können das mit einer nicht einfangenden Gruppe tun:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Dadurch wird die Übereinstimmung mit dem ersten Ziffernsatz optional, sodass die Regex trotzdem übereinstimmt, wenn sie nicht existiert (d. h. es gibt nur einen Ziffernsatz). Durch die Verwendung einer nicht einfangenden Gruppe (Hinzufügen des ?:
zum Anfang der Gruppe müssen wir die Ersetzungszeichenfolge von \1
nicht ändern . SQLFiddle
aktualisiert