A coisa mais fácil a fazer é usar um regex para preparar sua string para estar em um regex. O escape de caracteres que não são palavras em sua string deve ser suficiente para torná-la segura para regex, por exemplo:
=> select regexp_replace('. word * and µ{', E'([^\\w\\s])', E'\\\\\\1', 'g');
regexp_replace
--------------------
\. word \* and µ\{
Então, algo assim deve funcionar em geral:
where some_text ~* x || regexp_replace(some_field, E'([^\\w\\s])', E'\\\\\\1', 'g') || y
onde
x
e y
são as outras partes da regex. Se você não precisava de um regex no final (ou seja, não
y
acima), então você pode usar (?q)
:e um
q
significa que:Então você poderia usar:
where some_text ~* x || '(?q)' || some_field
neste caso limitado.