PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Obtenir la deuxième correspondance à partir des résultats de regexp_matches

Vous pouvez utiliser REGEXP_REPLACE :

SELECT REGEXP_REPLACE('1234567 - 7654321 - some - more - text', '^\d+[^\d]+(\d+).*$', '\1');

Sortie

7654321

Cette expression rationnelle recherche une chaîne commençant par un certain nombre de chiffres (^\d+ ) suivi de quelques caractères non numériques ([^\d]+ ) puis un autre groupe de chiffres ((\d+) ) suivi d'un certain nombre de caractères jusqu'à la fin de la chaîne (.*$ ). Le () autour du deuxième groupe de chiffres en fait un groupe de capture, auquel nous pouvons ensuite nous référer dans la chaîne de remplacement avec \1 . Depuis REGEXP_REPLACE ne remplace que les parties de la chaîne qui correspondent à la regex, il est nécessaire d'avoir une regex qui corresponde au tout chaîne afin de la remplacer uniquement par les données souhaitées.

Mettre à jour

S'il y a potentiellement des caractères avant le premier ensemble de chiffres, vous devez remplacer l'expression régulière par

^[^\d]*\d+[^\d]+(\d+).*$

Mise à jour 2

S'il est possible qu'il n'y ait qu'un seul ensemble de nombres au début, nous devons rendre la correspondance de la première partie facultative. Nous pouvons le faire avec un groupe non capturant :

^[^\d]*(?:\d+[^\d]+)?(\d+).*$

Cela rend la correspondance sur le premier ensemble de chiffres facultative, de sorte que si elle n'existe pas (c'est-à-dire qu'il n'y a qu'un seul ensemble de chiffres), la regex correspondra toujours. En utilisant un groupe non capturant (en ajoutant le ?: au début du groupe, nous n'avons pas besoin de changer la chaîne de remplacement de \1 . Mise à jour de SQLFiddle