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

split text if contains certain string postgres

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

你可以直接替换'sr_'

replace(exit_reason, 'sr_', '')

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

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

你可以尝试类似的方法:

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_' 并将所有下划线替换为空格。

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

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

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

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