PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Richtige Methode zum Hinzufügen von nicht maskiertem Text aus einem Feld zu einer Regex in Postgres?

Am einfachsten ist es, eine Regex zu verwenden, um Ihren String so vorzubereiten, dass er sich in einer Regex befindet. Das Escapezeichen von Nicht-Wort-Zeichen in Ihrer Zeichenfolge sollte ausreichen, um sie regex-sicher zu machen, zum Beispiel:

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

Also sollte so etwas im Allgemeinen funktionieren:

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

wobei x und y sind die anderen Teile der Regex.

Wenn Sie am Ende keinen regulären Ausdruck benötigen (d. h. kein y oben), dann könnten Sie (?q) :

und ein q bedeutet, dass die:

Sie könnten also verwenden:

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

in diesem begrenzten Fall.