sql >> Databáze >  >> RDS >> PostgreSQL

Získejte druhý zápas z výsledků regexp_matches

Můžete použít REGEXP_REPLACE :

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

Výstup

7654321

Tento regulární výraz hledá řetězec začínající určitým počtem číslic (^\d+ ) následované několika nečíslicovými znaky ([^\d]+ ) a poté další skupina číslic ((\d+) ) následovaný určitým počtem znaků až do konce řetězce (.*$ ). () kolem druhé skupiny číslicových znaků se jedná o zachycovací skupinu, na kterou pak můžeme odkazovat v náhradním řetězci pomocí \1 . Od REGEXP_REPLACE nahrazuje pouze části řetězce, které odpovídají regulárnímu výrazu, je nutné mít regulární výraz, který odpovídá celku řetězec, abyste jej nahradili pouze požadovanými daty.

Aktualizovat

Pokud jsou před první sadou číslic potenciálně znaky, měli byste změnit regulární výraz na

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

Aktualizace 2

Je-li možné, že na začátku je pouze jedna sada čísel, musíme povolit párování první části. Můžeme to udělat se skupinou, která nezachytává:

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

Díky tomu je shoda na první sadě číslic volitelná, takže pokud neexistuje (tj. existuje pouze jedna sada číslic), regulární výraz bude stále odpovídat. Použitím nezachycující skupiny (přidáním ?: na začátek skupiny, nemusíme měnit nahrazující řetězec z \1 . Aktualizováno SQLFiddle



  1. MYSQL:Postup s příkazem if

  2. Migrace Cizí klíč versus výmluvné vztahy v Laravelu

  3. Součet číslic čísla na serveru SQL bez použití tradičních smyček, jako je while

  4. Jak přimějete PyPy, Django a PostgreSQL ke spolupráci?