sql >> Databáze >  >> RDS >> PostgreSQL

Funkce Escape pro regulární výraz nebo vzory LIKE

Chcete-li odpovědět na otázku nahoře:

Funkce escape regulárního výrazu

Začněme úplným seznamem znaků se zvláštním významem v regulárním výrazu vzory:

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

Zabalené do výrazu v závorce většina z nich ztrácí svůj zvláštní význam – až na pár výjimek:

  • - musí být první nebo poslední nebo znamená rozsah postav.
  • ] a \ musí být escapovány pomocí \ (i v náhradě).

Po přidání závorek pro zachycení zpětné reference níže dostaneme tento vzor regulárního výrazu:

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

Pomocí této funkce tato funkce uzavře všechny speciální znaky zpětným lomítkem (\ ) - čímž se odstraní speciální význam:

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

Přidejte PARALLEL SAFE (protože je ) v Postgresu 10 nebo novějším, abyste umožnili paralelismus pro dotazy, které jej používají.

Ukázka

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

Vrátí:

test\(1\) \> Foo\*

A zatímco:

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

vrátí FALSE , což může být pro naivní uživatele překvapením,

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

Vrátí TRUE jak by teď mělo.

LIKE escape funkce

Pro úplnost přívěsek za LIKE vzory, kde jsou speciální pouze tři znaky:

\%_

Manuál:

Výchozí znak escape je zpětné lomítko, ale pomocí ESCAPE lze vybrat jiný doložka.

Tato funkce předpokládá výchozí:

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

Mohli bychom použít elegantnější regexp_replace() zde také, ale pro pár znaků kaskáda replace() funkce je rychlejší.

Opět PARALLEL SAFE v Postgres 10 nebo novějším.

Ukázka

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

Vrátí:

20\% \\ 50\% low\_prices


  1. Co je schéma v SQL Server a jak vytvořit/zrušit schéma v SQL Server databázi - SQL Server / TSQL výukový program, část 27

  2. Příklady RAND() v SQL Server

  3. Vložení více řádků do jednoho SQL dotazu?

  4. Připojovací dotaz MySQL pomocí like?