Postgres regexp_replace,使用第3个参数的函数

时间:2017-04-27 18:33:28

标签: postgresql

使用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组捕获作为输入参数传递?

2 个答案:

答案 0 :(得分:0)

我曾经same questionthis

我没有得到答案,但总体印象是你不应该在正则表达式函数的参数上使用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")$$
);