sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres:extrahera text upp till N:te tecknet i en sträng

Du kan använda mönstermatchning funktion i Postgres.

Först ta reda på ett mönster för att fånga allt upp till den fjärde > karaktär.

För att starta ditt mönster bör du skapa en undergrupp som fångar icke > tecken och en > tecken:

([^>]*>)

Fånga sedan det fyra gånger för att komma till den fjärde instansen av >

([^>]*>){4}

Sedan måste du slå in det i en grupp så att matchen tar tillbaka alla fyra instanserna:

(([^>]*>){4})

och sätt en början av sträng-symbol för att se till att den bara matchar från början av strängen (inte i mitten):

^(([^>]*>){4})

Här är ett fungerande exempel på regex101 på det!

När du har mönstret som kommer att returnera det du vill ha i det första gruppelementet (vilket du kan se i online-regexet på den högra sidopanelen), måste du välja det tillbaka i SQL.

I Postgres, understrängsfunktionen har ett alternativ att använda ett regexmönster för att extrahera text ur inmatningen med hjälp av en "från"-sats i delsträngen.

Sätt ihop allt för att avsluta!

select substring(filter_type from '^(([^>]*>){4})')
from filter_table

Se en fungerande sqlfiddle här

Om du vill matcha hela strängen när det finns mindre än fyra instanser av > , använd detta reguljära uttryck:

 ^(([^>]*>){4}|.*)


  1. Flera stigande ordning fungerar inte i Mysql

  2. exportera db-objekt för versionskontroll

  3. Vad betyder symbolen ( '> ) på kommandoraden i MySQL?

  4. Migrera från MySQL Enterprise till MariaDB 10.3