使用Postgres 9.4,是否可以对捕获的匹配应用函数?
示例:大写仅包含用双引号括起来的字符串。
SELECT regexp_replace(
'123, "name", ignored~me, "Beer & Cheese", pi=3.14',
'"(.+?)"',
upper('"\1"'),
'g'
);
--Result : '123, "name", ignored~me, "Beer & Cheese", pi=3.14'
--Expected: '123, "NAME", ignored~me, "BEER & CHEESE", pi=3.14'
看起来regexp_replace
的第3个参数中出现的函数被忽略了。无论如何使用函数并将\ n组捕获作为输入参数传递?
答案 0 :(得分:0)
我没有得到答案,但总体印象是你不应该在正则表达式函数的参数上使用SQL函数......
答案 1 :(得分:0)
在SQL中,函数不是一流的。他们不能通过。语言中没有任何部分可以解释。它是声明性的,编译的(使用优化器),并严格评估。
请记住,在正常情况下,更新任何列都需要重写整行(而不仅仅是列)。
你仍然可以做到这一点我只是想找一个稍微聪明的工具..
以下是plperl
,
CREATE LANGUAGE plperl;
CREATE OR REPLACE FUNCTION perl_dynamic_eval_regexp_replace( IN str text, IN pattern text, IN replacementPerl text, OUT text )
STRICT
AS $BODY$
my ($input, $pattern, $replacement) = @_;
$input =~ s/$pattern/eval $replacement/ge;
return $input;
$BODY$
LANGUAGE plperl
VOLATILE;
SELECT perl_dynamic_eval_regexp_replace(
'123, "name", ignored~me, "Beer & Cheese", pi=3.14',
'"(.+?)"',
$$uc("$1")$$
);