Solución:
Como comentó @a_horse, tendrías que usar el operador de expresión regular ~
para usar expresiones de corchetes.
Pero hay más. Yo sugiero:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
… coincidir al comienzo de la cadena (su expresión original podría coincidir en alguna posición).
[^0]
… una expresión de corchete (clase de carácter) que coincide alguna personaje que no es 0
.
O mejor, todavía:
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 normalmente más rápido que las expresiones regulares. Probablemente sea sustancialmente más rápido reducir el conjunto de candidatos con un LIKE
expresión.
Generalmente, usarías 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 btree simple índice para las expresiones ancladas a la izquierda value LIKE '00%'
(importante para tablas grandes), aunque puede que no funcione 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 trabajar para este ejemplo. Detalles:
- Diferencia entre LIKE y ~ en Postgres
PostgreSQL LIKE
el operador no es compatible [charlist], sin embargo SIMILAR TO
lo hace.
cheque AQUÍ para obtener una lista completa de las bases de datos