Для этого вам нужно динамический 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 здесь
Тесно связаны, с дополнительным объяснением: