Jak skomentował @a_horse, musiałbyś użyć operatora wyrażenia regularnego ~
aby używać wyrażeń w nawiasach.
Ale to nie wszystko. Proponuję:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
... pasuje na początek ciągu (Twoje oryginalne wyrażenie może pasować w dowolnym pozycja).[^0]
... wyrażenie w nawiasie (klasa znaków) pasujące do dowolnego znak, który nie jest 0
.
Lub lepiej , jeszcze:
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
Czemu? LIKE
nie jest tak potężny, ale zazwyczaj szybszy niż wyrażenia regularne. Prawdopodobnie znacznie szybciej można zawęzić listę kandydatów za pomocą taniego LIKE
wyrażenie.
Ogólnie rzecz biorąc, użyjesz NOT LIKE '__0'
, ale ponieważ już ustaliliśmy LIKE '00%'
w drugim predykacie możemy użyć węższego (tańszego) wzorca NOT LIKE '000'
.
Postgres może używać prostego indeksu drzewa btree dla wyrażeń zakotwiczonych z lewej strony value LIKE '00%'
(ważne w przypadku dużych tabel), podczas gdy może to nie zadziałać w przypadku bardziej złożonego wyrażenia regularnego. Najnowsza wersja Postgresa może używać indeksów do prostych wyrażeń regularnych, więc może pracuj dla tego przykładu. Szczegóły:
- Różnica między LIKE i ~ w Postgresie