#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
затем заменяет символы подчеркивания пробелами.