postgres SQL 使用来自正则表达式的值更新列 + 更多
postgres SQL update column with value from regex + more
我想更新 db.table.column 中所有匹配的 url。我想在 url 的末尾添加一个参数,其他一切保持原样。
我试过这个:
更新 table 设置 列 = regexp_replace(列, 'url_matcher', (子串 (列, 'url_matcher') || 'end_param');
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}') || '¶m={{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}') || '¶m={{param}}')
);
但子字符串不匹配整个 url 它只匹配 {{app.url}} 或 {{@root.app.url}} [=85 的所有其他内容=] 不匹配。
当我一个人时 运行 regexp_replace("bodyHtml", [相同模式], 'replace_thing') 它匹配整个 url 并将其替换为 "replace_thing"。因此,在一种情况下,正则表达式模式有效,而在另一种情况下则无效。所有不匹配 url 的字段都不会更新,但在使用子字符串函数时也会更新,如我的示例所示。所有与 url 不匹配的字段都更新为 null。
我可以不使用这样的嵌套函数吗?如果没有 - 我怎样才能达到我想要的效果?
除 regexp_replace 之外,其他正则表达式模式规则是否适用于子字符串函数?
列值的最大值:Hello user, click here {{app.url}}/home:search=true&item=33 to visit your page
regexp_replace 将匹配:{{app.url}}/home:search=true&item=33,子字符串将仅匹配 {{app.url}}
更新后列值应如下所示:
Hello user, click here {{app.url}}/home:search=true&item=33¶m={{param}} to visit your page
但它最终看起来像这样:
Hello user, click here {{app.url}}¶m={{param}} to visit your page
像这样的字段:Hello you have been registered!
看起来像这样:null
但应该保持不变。
正则表达式模式用于搜索匹配的文本。在替换模式中,您不能使用正则表达式,只能使用特定的结构,例如像 \1 这样的替换反向引用来引用捕获组 1 的值。另外替换时需要特殊的回调来修改匹配值,这里不支持。
您可以用 (
和 )
包裹整个模式(以创建捕获组)并使用如下正则表达式:
'({{(@root\.)?app\.url}}[a-zA-Z0-9@:%._+~#&={}/?-]{2,255})'
替代品看起来像
'¶m={{param}}'
其中 </code> 是对第 1 组值的替代反向引用。见 <a href="http://rextester.com/MHVIX41178" rel="nofollow noreferrer">online demo</a></p>
<pre><code>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})',
'¶m={{param}}');
我想更新 db.table.column 中所有匹配的 url。我想在 url 的末尾添加一个参数,其他一切保持原样。
我试过这个:
更新 table 设置 列 = regexp_replace(列, 'url_matcher', (子串 (列, 'url_matcher') || 'end_param');
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}') || '¶m={{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}') || '¶m={{param}}')
);
但子字符串不匹配整个 url 它只匹配 {{app.url}} 或 {{@root.app.url}} [=85 的所有其他内容=] 不匹配。
当我一个人时 运行 regexp_replace("bodyHtml", [相同模式], 'replace_thing') 它匹配整个 url 并将其替换为 "replace_thing"。因此,在一种情况下,正则表达式模式有效,而在另一种情况下则无效。所有不匹配 url 的字段都不会更新,但在使用子字符串函数时也会更新,如我的示例所示。所有与 url 不匹配的字段都更新为 null。
我可以不使用这样的嵌套函数吗?如果没有 - 我怎样才能达到我想要的效果?
除 regexp_replace 之外,其他正则表达式模式规则是否适用于子字符串函数?
列值的最大值:Hello user, click here {{app.url}}/home:search=true&item=33 to visit your page
regexp_replace 将匹配:{{app.url}}/home:search=true&item=33,子字符串将仅匹配 {{app.url}}
更新后列值应如下所示:
Hello user, click here {{app.url}}/home:search=true&item=33¶m={{param}} to visit your page
但它最终看起来像这样:
Hello user, click here {{app.url}}¶m={{param}} to visit your page
像这样的字段:Hello you have been registered!
看起来像这样:null
但应该保持不变。
正则表达式模式用于搜索匹配的文本。在替换模式中,您不能使用正则表达式,只能使用特定的结构,例如像 \1 这样的替换反向引用来引用捕获组 1 的值。另外替换时需要特殊的回调来修改匹配值,这里不支持。
您可以用 (
和 )
包裹整个模式(以创建捕获组)并使用如下正则表达式:
'({{(@root\.)?app\.url}}[a-zA-Z0-9@:%._+~#&={}/?-]{2,255})'
替代品看起来像
'¶m={{param}}'
其中 </code> 是对第 1 组值的替代反向引用。见 <a href="http://rextester.com/MHVIX41178" rel="nofollow noreferrer">online demo</a></p>
<pre><code>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})',
'¶m={{param}}');