разделенный текст, если содержит определенную строку postgres

#sql #postgresql #regexp-replace

Вопрос:

 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-ожидаемые выпуски», я хочу сохранить его только как «договорные причины».
До сих пор моя идея состоит в том, чтобы использовать

 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_)?([^-]*).*

Регулярное выражение соответствует необязательному началу  sr_  , затем всем символам до первого  -  , затем всему, что следует за этим, и сохраняет только среднюю часть.  replace   затем заменяет символы подчеркивания пробелами.



,
'2'
),
'_',
' '
);

replace
═════════════════════
contractual reasons
(1 row)
Регулярное выражение соответствует необязательному началу sr_ , затем всем символам до первого - , затем всему, что следует за этим, и сохраняет только среднюю часть. replace затем заменяет символы подчеркивания пробелами.