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

En lugar de LIKE y ~, ¿por qué solo SIMILAR TO funciona cuando se hace una coincidencia de expresiones regulares con alternativas?

LIKE admite la coincidencia de patrones usando _ para cualquier carácter único y % para cualquier secuencia de caracteres así:

SELECT 'thomas' LIKE '%(h|x)%'

no funciona porque LIKE no entiende (...) para agrupar o | para la alternancia, esos son solo caracteres literales en un patrón LIKE.

SIMILAR A admite _ y % lo mismo que LIKE pero agrega agrupación con (...) , alternancia con | , y algunas otras cosas así que esto:

SELECT 'thomas' SIMILAR TO '%(h|x)%'

funciona como se esperaba.

~* usa expresiones regulares POSIX así que (...) es para agrupar y | es para alternancia pero % es solo un signo de porcentaje; eso significa que esto:

SELECT 'thomas' ~* '%(h|x)%'

está buscando una h o x rodeado de signos de porcentaje y no funciona de la forma esperada.

Tu ~* La versión funcionará si usa una expresión regular adecuada como:

SELECT 'thomas' ~* '(h|x)' -- alternation
SELECT 'thomas' ~* 'h|x'   -- alternation without an unnecessary grouping
SELECT 'thomas' ~* '[hx]'  -- or a character class

La documentación vinculada anteriormente cubre todo esto.