我需要按顺序将表中的所有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
,列:match
,replace
必须在那里。