Podrías usar REGEXP_REPLACE
:
SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Salida
7654321
Esta expresión regular busca una cadena que comience con una cierta cantidad de dígitos (^\d+
) seguido de algunos caracteres que no son dígitos ([^\d]+
) y luego otro grupo de dígitos ((\d+)
) seguido de una cierta cantidad de caracteres hasta el final de la cadena (.*$
). El ()
alrededor del segundo grupo de caracteres de dígitos lo convierte en un grupo de captura, al que luego podemos referirnos en la cadena de reemplazo con \1
. Desde REGEXP_REPLACE
solo reemplaza las partes de la cadena que coinciden con la expresión regular, es necesario tener una expresión regular que coincida con el todo cadena para reemplazarla solo con los datos deseados.
Actualizar
Si hay caracteres potenciales antes del primer conjunto de dígitos, debe cambiar la expresión regular a
^[^\d]*\d+[^\d]+(\d+).*$
Actualización 2
Si es posible que solo haya un conjunto de números al principio, debemos hacer que la coincidencia de la primera parte sea opcional. Podemos hacer eso con un grupo que no captura:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Esto hace que la coincidencia en el primer conjunto de dígitos sea opcional, de modo que si no existe (es decir, solo hay un conjunto de dígitos), la expresión regular aún coincidirá. Al usar un grupo que no captura (agregando el ?:
al comienzo del grupo, no necesitamos cambiar la cadena de reemplazo de \1
. Actualizado SQLFiddle