Я хочу обновить текстовый столбец в таблице postgres. Текст в столбце только в нижнем регистре и состоит из UTF-8 символов, таких как [a-z0-9 \ u00DF- \ u00F6 \ u00F8- \ u017E \ u1E00- \ u1EFF \ u03B1- \ u03C9] плюс '_' (подчеркивание) плюс '' (пробел). Пространство это разделитель. Я хочу избавиться от подчеркивания в границе слова, только если это происходит более 3 раз на этой границе. Решение на основе regexp_replace () является предпочтительным, но его также можно решить с помощью других специфических для postgres функций, таких как string_to_array, unnest array_to_string и т. д.
Я нашел Как сопоставить, только если символ встречается n раз внутрисоответствует? , но не может адаптировать его для моей проблемы. Также экспериментировал с string_to_array (), unnest (), array_to_string (), ARRAY (), CASE WHEN, regex_match в комбинации, но я застрял.
'photovoltaics renewable_energies flexible_low_cost_solar_cells colloidal_quantum_dots colloidal_quantum_dots_test1_test2'
должно стать
'photovoltaics renewable_energies flexible low cost solar cells colloidal_quantum_dots colloidal quantum dots test1 test2'
Мне нужно заявление ОБНОВЛЕНИЕ. Как я могу обновить следующую таблицу?
CREATE TABLE test_table AS
SELECT 1 as id, 'photovoltaics renewable_energies flexible_low_cost_solar_cells colloidal_quantum_dots colloidal_quantum_dots_test1_test2' as word
UNION
SELECT 2,'inter_cultural_fish_studies test contact_zones knowledge_from_below'
;
Я мог бы адаптировать предложенное решение от @Abelisto к следующему:
UPDATE test_table
SET word = (select string_agg(case when length(w)-length(translate(w,'_','')) >= 3 then translate(w,'_',' ') else w end, ' ') as w from unnest(string_to_array(word, ' ')) as w)
;