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