PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Modo corretto per aggiungere testo senza escape da un campo a una regex in postgres?

La cosa più semplice da fare è usare un'espressione regolare per preparare la stringa in modo che sia in una espressione regolare. L'escape di caratteri non di parole nella stringa dovrebbe essere sufficiente per renderla sicura per le espressioni regolari, ad esempio:

=> select regexp_replace('. word * and µ{', E'([^\\w\\s])', E'\\\\\\1', 'g');
   regexp_replace   
--------------------
 \. word \* and µ\{

Quindi qualcosa del genere dovrebbe funzionare in generale:

where some_text ~* x || regexp_replace(some_field, E'([^\\w\\s])', E'\\\\\\1', 'g') || y

dove x e y sono le altre parti della regex.

Se non avevi bisogno di una regex alla fine (cioè nessun y sopra), puoi usare (?q) :

e un q significa che:

Quindi potresti usare:

where some_text ~* x || '(?q)' || some_field

in questo caso limitato.