将表中的所有regexp_replaces按顺序应用于一个字符串



我需要按顺序将表中的所有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后的结果。

可能吗?

为此,您需要动态 SQL。这意味着,您必须首先使用表 presence_regex 中的数据构建 SQL 语句,然后在下一步中执行它。您可以将其包装在 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')

regexp_replace()中删除第 4 个参数'g',以仅替换第一个匹配项。

叫:

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

db<>小提琴在这里

密切相关,还有更多解释:

  • 将公式存储在表中并在函数中使用该公式

基于Erwin Answer,一点点的修改。因为太多select有点混乱。(就我个人而言(

create or replace function f_serial_regexp(_string text)
returns setof text language plpgsql as
$$
    begin
    RETURN QUERY 
    execute format('select regexp_replace($1 , match, replace, ''g'') '
    || 'from  presence_regex order by order_id')  using _string;
    end
$$;

显然,预条件是表presence_regex,列:matchreplace必须在那里。

最新更新