PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Em vez de LIKE e ~, por que apenas SIMILAR TO funciona ao fazer correspondência de regex com alternativas


LIKE suporta correspondência de padrões usando _ para qualquer caractere único e % para qualquer sequência de caracteres, então isso:
SELECT 'thomas' LIKE '%(h|x)%'

não funciona porque LIKE não entende (...) para agrupamento ou | para alternância, esses são apenas caracteres literais em um padrão LIKE.

SIMILAR TO suporta _ e % o mesmo que LIKE mas adiciona agrupamento com (...) , alternância com | , e algumas outras coisas para isso:
SELECT 'thomas' SIMILAR TO '%(h|x)%'

funciona como esperado.

~* usa regexes POSIX para que (...) é para agrupamento e | é para alternância, mas % é apenas um sinal de porcentagem; isso significa que isso:
SELECT 'thomas' ~* '%(h|x)%'

está procurando por um h ou x cercado por sinais de porcentagem e não funciona da maneira que você espera.

Seu ~* versão funcionará se você usar um regex adequado como:
SELECT 'thomas' ~* '(h|x)' -- alternation
SELECT 'thomas' ~* 'h|x'   -- alternation without an unnecessary grouping
SELECT 'thomas' ~* '[hx]'  -- or a character class

A documentação vinculada acima cobre tudo isso.