2016-03-05 5 views
3

Я пытаюсь обновить все вхождения некоторого значения в каждом элементе столбца массива, используя regexp.Использование regexp_replace в столбце массива в postgres

Если столбец не типа text[] и текст, а я хотел бы использовать этот запрос для обновления:

UPDATE my_table 
SET my_column = regexp_replace(
    my_column, 'foo(\d+)', 'bar\1', 'g' 
) 

Как я могу заменить каждый элемент в столбце массива?

ответ

4

Самый простой способ, как я знаю:

UPDATE my_table SET 
    my_column = array(
    SELECT regexp_replace(unnest(my_column), 'foo(\d+)', 'bar\1', 'g')) 

PostgreSQL слишком умный. В качестве аргумента других функций можно использовать SRF (установить возвращаемые функции, просто google it). Например:

select abs(unnest('{1,-2,3}'::int[])); 

Это же к

select abs(x) from unnest('{1,-2,3}'::int[]) as x; 

, но более короткий.

Его возвращение

 
┌─────┐ 
│ abs │ 
╞═════╡ 
│ 1 │ 
│ 2 │ 
│ 3 │ 
└─────┘ 

И array(select ...) является просто конструктор массива, который преобразует select... результат в массив.

0

Используйте CTE для unnest() массив, выполните преобразование на элементах массива и агрегируйте обратно в массив, который затем используете для UPDATE. Если предположить, что таблица имеет первичный ключ:

WITH changed(key, arr) AS (
    SELECT id, array_agg(regexp_replace(col, 'foo(\d+)', 'bar\1', 'g')) 
    FROM my_table, unnest(my_column) un(col) 
    GROUP BY id 
) 
UPDATE my_table 
SET my_column = arr 
FROM changed 
WHERE id = key 
Смежные вопросы