PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Escape функция за регулярен израз или модели LIKE

За да отговорите на въпроса в горната част:

Изходна функция на регулярния израз

Нека започнем с пълен списък със знаци със специално значение в регулярния израз модели:

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

Обвити в израз в скоби, повечето от тях губят специалното си значение - с няколко изключения:

  • - трябва да бъде първи или последен или означава диапазон от знаци.
  • ] и \ трябва да се екранира с \ (и в подмяната).

След добавяне на улавяне на скоби за обратната препратка по-долу получаваме този модел на регулярни изрази:

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

Използвайки я, тази функция избягва всички специални символи с обратна наклонена черта (\ ) - като по този начин се премахва специалното значение:

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$;

Добавете PARALLEL SAFE (защото е ) в Postgres 10 или по-нова версия, за да позволите паралелизъм за заявки, които го използват.

Демо

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

Връща:

test\(1\) \> Foo\*

И докато:

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

връща FALSE , което може да бъде изненада за наивните потребители,

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

Връща TRUE както трябва сега.

LIKE escape функция

За пълнота висулката за LIKE шаблони, където само три знака са специални:

\%_

Ръководството:

Escape-символът по подразбиране е обратната наклонена черта, но може да бъде избран различен с помощта на ESCAPE клауза.

Тази функция приема по подразбиране:

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$;

Можем да използваме по-елегантния regexp_replace() тук също, но за няколкото знака, каскада от replace() функции е по-бърз.

Отново PARALLEL SAFE в Postgres 10 или по-нова версия.

Демо

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

Връща:

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. Django и postgresql схеми

  2. Стойност Грешка при импортиране на данни в postgres таблица с помощта на psycopg2

  3. Хибернация UUID с PostgreSQL и SQL Server

  4. Създаването на тригер за вмъкване на дъщерна таблица връща объркваща грешка

  5. PostgreSQL:експортирайте получените данни от SQL заявка в Excel/CSV