Zoals @a_horse opmerkte, zou je de reguliere expressie-operator ~
. moeten gebruiken om haakjesuitdrukkingen te gebruiken.
Maar er is meer. Ik stel voor:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
... komt overeen met het begin van de tekenreeks (uw originele uitdrukking kan overeenkomen met elke positie).[^0]
... een haakje-uitdrukking (tekenklasse) die overeenkomt met elke teken dat niet 0
. is .
Of beter , maar toch:
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
Waarom? LIKE
is niet zo krachtig, maar doorgaans sneller dan reguliere expressies. Het is waarschijnlijk aanzienlijk sneller om het aantal kandidaten te beperken met een goedkope LIKE
uitdrukking.
Over het algemeen gebruikt u NOT LIKE '__0'
, maar aangezien we al LIKE '00%'
in het andere predikaat kunnen we het smallere (goedkopere) patroon gebruiken NOT LIKE '000'
.
Postgres kan een eenvoudige btree index . gebruiken voor de links verankerde uitdrukkingen value LIKE '00%'
(belangrijk voor grote tabellen), terwijl dat misschien niet werkt voor een complexere reguliere expressie. De nieuwste versie van Postgres kan indexen gebruiken voor eenvoudige reguliere expressies, dus misschien werk voor dit voorbeeld. Details:
- Verschil tussen LIKE en ~ in Postgres