Najprostszą rzeczą do zrobienia jest użycie wyrażenia regularnego do przygotowania łańcucha do wyrażenia regularnego. Uciekanie znaków niebędących słowami w ciągu powinno wystarczyć, aby był on bezpieczny dla wyrażenia regularnego, na przykład:
=> select regexp_replace('. word * and µ{', E'([^\\w\\s])', E'\\\\\\1', 'g');
regexp_replace
--------------------
\. word \* and µ\{
Więc coś takiego powinno działać ogólnie:
where some_text ~* x || regexp_replace(some_field, E'([^\\w\\s])', E'\\\\\\1', 'g') || y
gdzie x
i y
to pozostałe części wyrażenia regularnego.
Jeśli nie potrzebujesz wyrażenia regularnego na końcu (np. brak y
powyżej), możesz użyć (?q)
:
i q
oznacza, że:
Możesz więc użyć:
where some_text ~* x || '(?q)' || some_field
w tym ograniczonym przypadku.