Você pode usar
REGEXP_REPLACE
:SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');
Resultado
7654321
Este regexp procura uma string começando com algum número de dígitos (
^\d+
) seguido por alguns caracteres não dígitos ([^\d]+
) e depois outro grupo de dígitos ((\d+)
) seguido por algum número de caracteres até o final da string (.*$
). O ()
em torno do segundo grupo de caracteres de dígitos faz com que seja um grupo de captura, ao qual podemos nos referir na string de substituição com \1
. Desde REGEXP_REPLACE
apenas substitui as partes da string que correspondem ao regex, é necessário ter um regex que corresponda ao todo string para substituí-lo apenas pelos dados desejados. Atualizar
Se houver potencialmente caracteres antes do primeiro conjunto de dígitos, você deve alterar o regex para
^[^\d]*\d+[^\d]+(\d+).*$
Atualização 2
Se for possível que haja apenas um conjunto de números no início, devemos tornar opcional a correspondência da primeira parte. Podemos fazer isso com um grupo sem captura:
^[^\d]*(?:\d+[^\d]+)?(\d+).*$
Isso torna a correspondência no primeiro conjunto de dígitos opcional, de modo que, se não existir (ou seja, houver apenas um conjunto de dígitos), a regex ainda corresponderá. Usando um grupo sem captura (adicionando o
?:
para o início do grupo, não precisamos alterar a string de substituição de \1
. Atualizado SQLFiddle