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.
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%';
有一个 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.
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%';