Como comentó @a_horse, tendría que usar el operador de expresión regular ~
usar expresiones entre paréntesis.
Pero hay más. Sugiero:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
... coincide con el inicio de la cadena (su expresión original podría coincidir con cualquiera posición).[^0]
... una expresión de paréntesis (clase de carácter) que coincida con any carácter que no es 0
.
O mejor , sin embargo:
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
¿Por qué? LIKE
no es tan potente, pero suele ser más rápido que las expresiones regulares. Probablemente sea sustancialmente más rápido reducir el conjunto de candidatos con un LIKE
económico. expresión.
Generalmente, usaría NOT LIKE '__0'
, pero como ya establecemos LIKE '00%'
en el otro predicado, podemos usar el patrón más estrecho (más barato) NOT LIKE '000'
.
Postgres puede usar un índice btree simple para las expresiones ancladas a la izquierda value LIKE '00%'
(importante para tablas grandes), mientras que eso podría no funcionar para una expresión regular más compleja. La última versión de Postgres puede usar índices para expresiones regulares simples, por lo que podría trabajo para este ejemplo. Detalles:
- Diferencia entre LIKE y ~ en Postgres