PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Funkcja Escape dla wyrażeń regularnych lub wzorców LIKE

Aby odpowiedzieć na pytanie na górze:

Funkcja ucieczki wyrażeń regularnych

Zacznijmy od pełnej listy znaków o specjalnym znaczeniu w wyrażeniu regularnym wzory:

!$()*+.:<=>?[\]^{|}-

Ujęte w nawiasy wyrażenia, większość z nich traci swoje szczególne znaczenie - z kilkoma wyjątkami:

  • - musi być pierwszy lub ostatni lub oznacza zakres znaków.
  • ] i \ muszą być escapowane za pomocą \ (również w zamian).

Po dodaniu nawiasów przechwytujących dla poniższego odniesienia wstecznego otrzymujemy następujący wzorzec wyrażenia regularnego:

([!$()*+.:<=>?[\\\]^{|}-])

Używając go, ta funkcja wyprowadza wszystkie znaki specjalne z odwrotnym ukośnikiem (\ ) - usuwając tym samym specjalne znaczenie:

CREATE OR REPLACE FUNCTION f_regexp_escape(text)
  RETURNS text
  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
$func$
SELECT regexp_replace($1, '([!$()*+.:<=>?[\\\]^{|}-])', '\\\1', 'g')
$func$;

Dodaj PARALLEL SAFE (ponieważ jest) ) w Postgresie 10 lub nowszym, aby umożliwić równoległość zapytań, które go używają.

Demo

SELECT f_regexp_escape('test(1) > Foo*');

Zwroty:

test\(1\) \> Foo\*

A gdy:

SELECT 'test(1) > Foo*' ~ 'test(1) > Foo*';

zwraca FALSE , co może zaskoczyć naiwnych użytkowników,

SELECT 'test(1) > Foo*' ~ f_regexp_escape('test(1) > Foo*');

Zwraca TRUE tak jak powinno teraz.

LIKE funkcja ucieczki

Aby uzyskać kompletność, wisiorek dla LIKE wzorce, w których tylko trzy znaki są specjalne:

\%_

Instrukcja:

Domyślnym znakiem ucieczki jest ukośnik odwrotny, ale można wybrać inny, używając ESCAPE klauzula.

Ta funkcja zakłada domyślne:

CREATE OR REPLACE FUNCTION f_like_escape(text)
  RETURNS text
  LANGUAGE sql IMMUTABLE STRICT PARALLEL SAFE AS
$func$
SELECT replace(replace(replace($1
         , '\', '\\')  -- must come 1st
         , '%', '\%')
         , '_', '\_');
$func$;

Moglibyśmy użyć bardziej eleganckiego regexp_replace() tutaj też, ale dla kilku znaków, kaskada replace() funkcje są szybsze.

Ponownie, PARALLEL SAFE w Postgresie 10 lub nowszym.

Demo

SELECT f_like_escape('20% \ 50% low_prices');

Zwroty:

20\% \\ 50\% low\_prices


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź nazwę hosta i port za pomocą poleceń PSQL

  2. Jak wyjść z narzędzia wiersza poleceń PostgreSQL:psql

  3. psql:nie można połączyć się z serwerem:Połączenie odrzucone Błąd podczas łączenia się ze zdalną bazą danych

  4. Obliczanie wartości procentowych za pomocą zapytania GROUP BY

  5. PostgreSQL:nadaj użytkownikowi wszystkie uprawnienia w bazie danych PostgreSQL