如果包含某些字符串 postgres 则拆分文本

Posted

技术标签:

【中文标题】如果包含某些字符串 postgres 则拆分文本【英文标题】:split text if contains certain string postgres 【发布时间】:2021-10-31 22:12:31 【问题描述】:
exit_reason

sr_inefficient_management
tech_too_complex
company_member_resignation
sr_product_engagement
sr_contractual_reasons
sr_contractual_reasons-expectation_issues
sr_churn-takeover_business

如果值包含字符串“sr_”,我想拆分列,并保持其余部分不变。如果该列包含“-”例如“sr_contractual_reasons-expectation_issues”,我只想将其保留为“合同原因”。 到目前为止,我的想法是使用

case when exit_reason like '%inefficient_management%' then 'inefficient management'

但是如果有很多不同的值,我就有麻烦了。

预期输出

exit_reason column

tech too complex
company member resignation
product engagement
contractual reasons
contractual reasons
churn

【问题讨论】:

【参考方案1】:

你可以直接替换'sr_'

replace(exit_reason, 'sr_', '')

'sr_' 不太可能出现在任何原因中。但是您可以使用regexp_replace() 来确定:

regexp_replace(exit_reason, '^sr_', '')

【讨论】:

【参考方案2】:

你可以试试类似的:

REPLACE(
    CASE
        WHEN exit_reason LIKE '%-%'
        THEN split_part(exit_reason,'-',2)
        WHEN exit_reason LIKE 'sr_%'
        THEN split_part(exit_reason,'sr_',2)
        ELSE exit_reason
    END
    , '_', ' '
)

此代码首先检查“exist_reason”是否有连字符,然后检查是否有“sr_”并将所有下划线替换为空格。

【讨论】:

【参考方案3】:

要同时删除后缀,您可以使用:

SELECT replace(
          regexp_replace(
             'sr_contractual_reasons-expectation_issues',
             '^(sr_)?([^-]*).*$',
             '\2'
          ),
          '_',
          ' '
       );

       replace       
═════════════════════
 contractual reasons
(1 row)

正则表达式匹配一个可选的前导sr_,然后是所有字符,直到第一个-,然后是后面的任何字符,并且只保留中间部分。 replace 然后用空格替换下划线。

【讨论】:

以上是关于如果包含某些字符串 postgres 则拆分文本的主要内容,如果未能解决你的问题,请参考以下文章

C# 正则表达式拆分但如果拆分失败则包含空字符串

如果不包含某些字符串,则替换某些子值?还是重写 XPATH 查询?网站抓取

如果字符串包含 PySpark 中的某些子字符串,则替换字符串

postgres 9.4将多个分隔符上的列拆分为新列

用于检查字符串是不是不应包含某些单词的正则表达式,但如果这些单词前面有“to”或“for”,则这些单词是可以的

如何拆分列包括键和值到postgres中的单独列中