Stejně jako v komentáři @a_horse byste museli použít operátor regulárního výrazu ~
používat výrazy se závorkami.
Ale je toho víc. Navrhuji:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
... shoda na začátku řetězce (váš původní výraz se může shodovat na jakýkoli pozici).[^0]
... výraz v závorce (třída znaků) odpovídající jakémukoli znak, který není 0
.
Nebo lépe , ještě:
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
Proč? LIKE
není tak výkonný, ale obvykle rychlejší než regulární výrazy. Pravděpodobně je podstatně rychlejší zúžit množinu kandidátů pomocí levného LIKE
výraz.
Obecně byste použili NOT LIKE '__0'
, ale protože jsme již vytvořili LIKE '00%'
v druhém predikátu můžeme použít užší (levnější) vzor NOT LIKE '000'
.
Postgres může používat jednoduchý index btree pro výrazy ukotvené vlevo value LIKE '00%'
(důležité pro velké tabulky), zatímco u složitějšího regulárního výrazu to nemusí fungovat. Nejnovější verze Postgresu může používat indexy pro jednoduché regulární výrazy, takže může práce pro tento příklad. Podrobnosti:
- Rozdíl mezi LIKE a ~ v Postgres