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.