postgres SQL更新列,其值来自正则表达式+更多

时间:2018-06-13 08:17:10

标签: sql regex postgresql substring regexp-replace

我想更新db.table.column中所有匹配的网址。我想在网址的末尾添加一个参数,并保留其他所有内容。

我试过这个:

更新 设置 = regexp_replace 列< / em>,&#39; url_matcher&#39;,(子字符串,&#39; url_matcher&#39;)||&#39; end_param&#39 );

UPDATE
    "db"."emailTemplate"
set 
    "bodyText" = regexp_replace(
        "bodyText",
        '({{(@root\.)?app\.url}})[a-zA-Z0-9@:%._\+~#\-&={}\/?]{2,255}',
        (substring("bodyText" from '({{(@root\.)?app\.url}})[a-zA-Z0-9@:%._\+~#\-&={}\/?]{2,255}') || '&param={{param}}')
    ),
    "bodyHtml" = regexp_replace(
        "bodyHtml",
        '({{(@root\.)?app\.url}})[a-zA-Z0-9@:%._\+~#\-&={}\/?]{2,255}',
        (substring("bodyHtml" from '({{(@root\.)?app\.url}})[a-zA-Z0-9@:%._\+~#\-&={}\/?]{2,255}') || '&param={{param}}')
    );

但是子字符串与整个网址不匹配,只匹配{{app.url}}或{{@ root.app.url}}网址的其他内容都不匹配。

当我独自运行regexp_replace(&#34; bodyHtml&#34;,[相同模式],&#39; replace_thing&#39;)时,它会匹配整个网址,并将其替换为&#34; replace_thing&#34;。因此,在一种情况下,正则表达式模式起作用,而在另一种情况下,它不起作用。所有与url不匹配的字段都不会更新,但在使用子字符串函数时也会更新,如我的示例所示。所有与网址不匹配的字段都会更新为null。

  1. 我可以不使用这样的嵌套函数吗?如果不是 - 我怎么能达到我想要的呢?

  2. 其他正则表达式模式规则是否适用于子字符串函数而不是regexp_replace?

  3. 列值的最大值:Hello user, click here {{app.url}}/home:search=true&item=33 to visit your page regexp_replace将匹配: {{app.url}} / home:search = true&amp; item = 33 ,substring只匹配 {{app.url}}

    更新后,列值应如下所示:

    Hello user, click here {{app.url}}/home:search=true&item=33&param={{param}} to visit your page

    但最终看起来像这样:

    Hello user, click here {{app.url}}&param={{param}} to visit your page

    这样的字段:Hello you have been registered!将如下所示:null但应该不受影响。

1 个答案:

答案 0 :(得分:1)

正则表达式模式用于搜索匹配的文本。在替换模式中,您可能不使用正则表达式,只能使用特定的结构,例如替换后向引用,如\ 1,指代捕获组1的值。此外,您需要特殊的回调来在替换期间修改匹配值,这里不支持。

您可以使用()包装整个模式(以创建捕获组)并使用这样的正则表达式:

'({{(@root\.)?app\.url}}[a-zA-Z0-9@:%._+~#&={}/?-]{2,255})'

替换将看起来像

'\1&param={{param}}'

其中\1是对第1组值的替换反向引用。请参阅online demo

select regexp_replace('Hello user, click here {{app.url}}/home:search=true&item=33 to visit your page',
                      '({{(@root\.)?app\.url}}[a-zA-Z0-9@:%._+~#&={}/?-]{2,255})',
                      '\1&param={{param}}');

enter image description here