sql >> Database teknologi >  >> RDS >> PostgreSQL

Regulært udtryk i PostgreSQL LIKE-sætning

Som @a_horse kommenterede, skal du bruge operatoren for regulære udtryk ~ at bruge parentes udtryk.
Men der er mere. Jeg foreslår:

SELECT *
FROM   tbl
WHERE  value ~ '^00[^0]'

^ ... match ved starten af ​​streng (dit originale udtryk kunne matche hvilken som helst). position).
[^0] ... et parentesudtryk (tegnklasse), der matcher enhver tegn, der ikke er 0 .

Eller bedre , endnu:

SELECT *
FROM   tbl
WHERE  value LIKE '00%'       -- starting with '00'
AND    value NOT LIKE '000%'  -- third character is not '0'

Hvorfor? LIKE er ikke så kraftig, men typisk hurtigere end regulære udtryk. Det er sandsynligvis væsentligt hurtigere at indsnævre antallet af kandidater med en billig LIKE udtryk.

Generelt vil du bruge NOT LIKE '__0' , men da vi allerede etablerer LIKE '00%' i det andet prædikat kan vi bruge det smallere (billigere) mønster NOT LIKE '000' .

Postgres kan bruge et simpelt btree indeks for de venstreforankrede udtryk value LIKE '00%' (vigtigt for store borde), mens det måske ikke virker for et mere komplekst regulært udtryk. Den seneste version af Postgres kan bruge indekser til simple regulære udtryk, så det kan arbejde for dette eksempel. Detaljer:

  • Forskellen mellem LIKE og ~ i Postgres


  1. Hvad sker der, hvis du ikke forpligter en transaktion til en database (f.eks. SQL Server)?

  2. LISTAGG i Oracle for at returnere forskellige værdier

  3. Multi-DC PostgreSQL:Opsætning af en standby-knude på en anden geografisk placering via en VPN

  4. Forstå forskellen mellem EXCEPT og NOT IN-operatører