La chose la plus simple à faire est d'utiliser une regex pour préparer votre chaîne à être dans une regex. L'échappement de caractères non verbaux dans votre chaîne devrait suffire à la rendre sûre pour les expressions régulières, par exemple :
=> select regexp_replace('. word * and µ{', E'([^\\w\\s])', E'\\\\\\1', 'g');
regexp_replace
--------------------
\. word \* and µ\{
Donc, quelque chose comme ça devrait fonctionner en général :
where some_text ~* x || regexp_replace(some_field, E'([^\\w\\s])', E'\\\\\\1', 'g') || y
où x
et y
sont les autres parties de la regex.
Si vous n'avez pas besoin d'une expression régulière à la fin (c'est-à-dire pas de y
ci-dessus), alors vous pouvez utiliser (?q)
:
et un q
signifie que :
Vous pouvez donc utiliser :
where some_text ~* x || '(?q)' || some_field
dans ce cas limité.