PostgreSQL 正则表达式用条件替换函数

PostgreSQL regexp replace function with condition

有一个 PostgreSQL table。 table 有一个字段,其中包含存储过程的查询字符串。 我正在寻找一个正则表达式替换解决方案,我可以用它删除字符串的一部分,但仅限于字符串包含 '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是静态值,只有table名字不同。其中一些包含 tmp 个子字符串,一些不包含。

如果它包含 tmp,我们应该删除 schema1 字符串。

您可以按如下方式使用 regexp_replace()

regexp_replace(mycol, '\sschema1\.(\w+_tmp)\s', '  ')

正则表达式细分:

\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

当字符串匹配正则表达式时,匹配的表达式被替换为:一个space,然后是捕获的部分,然后是另一个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', '  ') newcol from t
mycol                            | newcol                      
:------------------------------- | :---------------------------
... from schema1.table_1_tmp ... | ... from table_1_tmp ...    
... from schema1.table_2 ...     | ... from schema1.table_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%';