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 正则表达式用条件替换函数的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用正则表达式进行条件替换功能

PostgreSQL 中的正则表达式替换

如何在 PySpark 中编写条件正则表达式替换?

正则表达式高级替换,匹配后进行运算,然后使用结果替换,怎么实现?

Oracle 正则表达式替换为条件

正则表达式