Comme @a_horse l'a commenté, vous devrez utiliser l'opérateur d'expression régulière ~
utiliser des expressions entre parenthèses.
Mais il y a plus. Je suggère :
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
... correspond au début de la chaîne (votre expression d'origine peut correspondre à tout poste).[^0]
... une expression entre parenthèses (classe de caractères) correspondant à any caractère qui n'est pas 0
.
Ou mieux , encore :
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
Pourquoi? LIKE
n'est pas aussi puissant, mais généralement plus rapide que les expressions régulières. Il est probablement beaucoup plus rapide de réduire l'ensemble des candidats avec un LIKE
bon marché expression.
Généralement, vous utiliserez NOT LIKE '__0'
, mais puisque nous avons déjà établi LIKE '00%'
dans l'autre prédicat, nous pouvons utiliser le modèle plus étroit (moins cher) NOT LIKE '000'
.
Postgres peut utiliser un simple index btree pour les expressions ancrées à gauche value LIKE '00%'
(important pour les grandes tables), alors que cela pourrait ne pas fonctionner pour une expression régulière plus complexe. La dernière version de Postgres peut utiliser des index pour des expressions régulières simples, donc il pourrait travailler pour cet exemple. Détails :
- Différence entre LIKE et ~ dans Postgres