sql >> Databasteknik >  >> RDS >> PostgreSQL

Få andra matchen från regexp_matches resultat

Du kan använda REGEXP_REPLACE :

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

Utdata

7654321

Detta regexp letar efter en sträng som börjar med ett visst antal siffror (^\d+ ) följt av några icke-siffriga tecken ([^\d]+ ) och sedan en annan grupp av siffror ((\d+) ) följt av ett visst antal tecken till slutet av strängen (.*$ ). () runt den andra gruppen av siffror gör det till en fångstgrupp, som vi sedan kan referera till i ersättningssträngen med \1 . Sedan REGEXP_REPLACE ersätter bara de delar av strängen som matchar regexet, det är nödvändigt att ha ett regex som matchar hela sträng för att ersätta den med bara önskad data.

Uppdatera

Om det potentiellt finns tecken före den första uppsättningen siffror, bör du ändra regex till

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

Uppdatering 2

Om det är möjligt att det bara finns en uppsättning siffror i början måste vi göra matchning av den första delen valfri. Vi kan göra det med en icke-fångande grupp:

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

Detta gör matchningen på den första uppsättningen siffror valfri så att om den inte finns (dvs. det finns bara en uppsättning siffror) kommer regexet fortfarande att matcha. Genom att använda en icke-fångande grupp (lägga till ?: till början av gruppen behöver vi inte ändra ersättningssträngen från \1 . Uppdaterad SQLFiddle



  1. Konstigt beteende Laravel Homestead Database Connection

  2. Oracle In-Memory Kostnad

  3. MySQL returnerar sant/falskt om kolvärdet !=angivet värde

  4. Optimerar GROUP BY + COUNT DISTINCT på ohnestad jsonb-kolumn