Применить все regexp_replaces из таблицы последовательно к одной строке - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно последовательно применить все regex_replace из таблицы к одной данной строке. Как я могу сделать это с одним запросом SQL?

PostgreSQL - 11,2.

xbox=> \d presence_regex
           Table "public.presence_regex"
 Column  |  Type   | Collation | Nullable | Default
---------+---------+-----------+----------+---------
 match   | text    |           |          |
 replace | text    |           |          |

xbox=> select regexp_replace('Playing FIFA 19 Pro Clubs 2-1 LIL V BVB, 1st Half', 
                                match, replace) from presence_regex;

Выбор выше выполняет замену исходной строки и возвращает количество строк, но мне нужна только одна: результат после применения всех regex_replaces из таблицы.

Возможно ли это?

1 Ответ

0 голосов
/ 31 мая 2019

Для этого вам нужно динамический SQL .Это означает, что вы должны сначала построить оператор SQL, используя данные в таблице presence_regex, а затем выполнить его на следующем шаге.Вы можете заключить его в функцию plpgsql как один шаг.

Предполагая, что

  • , есть столбец для указания порядок , в котором должны применяться замены (что имеет смысл).

  • вы хотите заменить все вхождения, а не только первое.

Эта функция позволит достичь этого:

CREATE OR REPLACE FUNCTION f_serial_regexp(_string text, OUT _result text) AS
$func$
BEGIN
   EXECUTE (
   SELECT 'SELECT '
       || string_agg('regexp_replace(', '')
       || '$1'
       || string_agg(format(', %L, %L, ''g'')', match, replace), '')
   FROM   (
      SELECT match, replace
      FROM   presence_regex
      ORDER  BY order_id    -- column indicating the order
      ) sub
   )
   USING $1
   INTO _result;
END
$func$  LANGUAGE plpgsql;

Создает и выполняет SELECT запрос формы (пример для двух строкв таблице):

SELECT regexp_replace(regexp_replace($1, 'FIFA \d+', 'bab', 'g'), 'bab', 'XXX', 'g')

Удалите 4-й параметр 'g' из regexp_replace(), чтобы заменить только первый экземпляр.

Вызов:

SELECT f_serial_regexp('Playing FIFA 19 Pro Clubs 2-1 LIL V BVB, 1st Half');

db <> fiddle здесь

Тесно связаны, с дополнительным объяснением:

...