sql >> Databasteknik >  >> RDS >> PostgreSQL

Reguljärt uttryck i PostgreSQL LIKE-sats

Som @a_horse kommenterade, skulle du behöva använda operatorn för reguljära uttryck ~ att använda parentesuttryck.
Men det finns mer. Jag föreslår:

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

^ ... matcha i början av strängen (ditt ursprungliga uttryck kan matcha vilket som helst position).
[^0] ... ett parentesuttryck (teckenklass) som matchar alla tecken som inte är 0 .

Eller bättre , ännu:

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

Varför? LIKE är inte lika kraftfullt, men vanligtvis snabbare än reguljära uttryck. Det går förmodligen betydligt snabbare att begränsa antalet kandidater med en billig LIKE uttryck.

I allmänhet skulle du använda NOT LIKE '__0' , men eftersom vi redan har etablerat LIKE '00%' i det andra predikatet kan vi använda det smalare (billigare) mönstret NOT LIKE '000' .

Postgres kan använda ett enkelt btree index för de vänsterförankrade uttrycken value LIKE '00%' (viktigt för stora tabeller), medan det kanske inte fungerar för ett mer komplext reguljärt uttryck. Den senaste versionen av Postgres kan använda index för enkla reguljära uttryck, så det kan arbeta för detta exempel. Detaljer:

  • Skillnaden mellan LIKE och ~ i Postgres


  1. SQL Server-väntehändelser -3

  2. Tar rekordet med maxdatum

  3. Bästa SQL-återställningsverktyget för 2020 för att återställa avgörande SQL-databas

  4. SQL-ändringstabell