PostgreSQL 正则表达式用条件替换函数
Posted
技术标签:
【中文标题】PostgreSQL 正则表达式用条件替换函数【英文标题】:PostgreSQL regexp replace function with condition 【发布时间】:2020-05-25 15:36:18 【问题描述】:有一个 PostgreSQL 表。该表有一个字段,其中包含存储过程的查询作为字符串。 我正在寻找一个正则表达式替换解决方案,我能够删除字符串的一部分,但仅在字符串包含“tmp”的情况下。
示例字符串输入:
...from schema1.table_1...
...from schema1.table_1_tmp...
...from schema1.table_2...
...from schema1.table_2_tmp...
目标:
...from schema1.table_1...
...from table_1_tmp...
...from schema1.table_2...
...from table_2_tmp...
schema1
是静态值,只是表名不同。其中一些包含tmp
子字符串,其中一些不包含。
如果它包含 tmp,我们应该删除 schema1
字符串。
【问题讨论】:
您是否正在寻找一个 UPDATE 语句来永久更改这些值? 【参考方案1】:您可以使用regexp_replace()
,如下所示:
regexp_replace(mycol, '\sschema1\.(\w+_tmp)\s', ' \1 ')
正则表达式分解:
\s a space
schema1\. litteral string "schema1."
( beginning of a capturing group
\w+ at many alphanumeric characters as possible (including "_")
_tmp litteral string "_tmp"
) end of the capturing group
\s a space
当字符串匹配正则表达式时,匹配表达式被替换为:一个空格,然后是捕获的部分,然后是另一个空格。
Demo on DB Fiddle:
with t as (
select '... from schema1.table_1_tmp ...' mycol
union all select '... from schema1.table_2 ...'
)
select mycol, regexp_replace(mycol, '\sschema1\.(\w+_tmp)\s', ' \1 ') newcol from t
麦考尔 |纽科尔
:-------------------------------- | :----------------------------
...来自schema1.table_1_tmp ... | ...来自 table_1_tmp ...
... 从 schema1.table_2 ... | ...来自 schema1.table_2 ...
【讨论】:
你的解释很好,它应该可以工作,但不幸的是没有......我也尝试了你的演示代码,但没有工作。也许 PostgreSQL 版本会出现差异?我正在使用 8.3.23。【参考方案2】:您确实需要更新您的 Postgres 版本; 8.3.x 版于 2013 年 2 月终止。但是,@GMB 答案应该可以工作,因为其中确实存在所有适当的正则表达式函数。不过,你也可以试试替换功能。
with test_tab (tbl) as
( values ('...from schema1.table_1...')
, ('...from schema1.table_1_tmp...')
, ('...from schema1.table_2...')
, ('...from schema1.table_2_tmp...')
)
select replace(tbl,'schema1.','') "Without Schema"
from test_tab
where tbl ilike '%schema1%_tmp%';
【讨论】:
以上是关于PostgreSQL 正则表达式用条件替换函数的主要内容,如果未能解决你的问题,请参考以下文章