Como @a_horse comentou, você teria que usar o operador de expressão regular
~
para usar expressões de colchetes.Mas há mais. Eu sugiro:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
... corresponde ao início da string (sua expressão original pode corresponder a qualquer posição).[^0]
... uma expressão de colchetes (classe de caractere) correspondendo a qualquer caractere que não é 0
. Ou melhor , ainda:
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
Por quê?
LIKE
não é tão poderoso, mas normalmente mais rápido que expressões regulares. Provavelmente é substancialmente mais rápido restringir o conjunto de candidatos com um LIKE
barato expressão. Geralmente, você usaria
NOT LIKE '__0'
, mas como já estabelecemos LIKE '00%'
no outro predicado, podemos usar o padrão mais estreito (mais barato) NOT LIKE '000'
. O Postgres pode usar um índice simples btree para as expressões ancoradas à esquerda
value LIKE '00%'
(importante para tabelas grandes), enquanto isso pode não funcionar para uma expressão regular mais complexa. A versão mais recente do Postgres pode usar índices para expressões regulares simples, então pode trabalhar para este exemplo. Detalhes:- Diferença entre LIKE e ~ no Postgres