sql >> Base de Datos >  >> RDS >> PostgreSQL

Expresión regular en la cláusula LIKE de PostgreSQL

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