PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Obtenha a segunda correspondência dos resultados de regexp_matches


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