Postgres: изменять каждый элемент массива

#arrays #postgresql #liquibase

#массивы #postgresql #liquibase

Вопрос:

У меня двойной столбец postgres[]: {100, 101, 102}.

Я хочу разделить каждый элемент на 10, поэтому результатом должно быть {10.0, 10.1, 10.2}.

Я нашел решения только с помощью операторов for, но как реализовать это с помощью простого запроса? (Мне нужно обновить через liquibase)

Альтернативой является написание Java-миграции, но я бы предпочел простой запрос…

Заранее спасибо!

Обновить:

Вторая проблема, которая возникла, заключается в:

Делая это с помощью скрипта миграции на Java на базе Liquibase, вы получаете liquibase.database.jvm.JdbcConnection (через liquibase.change.custom.CustomTaskChange ), который, конечно, не поддерживает postgres-arrays =/.

Как обрабатывать массивы таким образом? (Я использую liquibase-core 3.5.5)

Комментарии:

1. Это было бы так просто при правильно нормализованной модели данных

2. Я знаю правильно 🙂 Недостатком с другой стороны было бы множество дополнительных таблиц, ссылок и т.д. … Поскольку мы получили около 8 свойств в виде массива, каждое из которых содержит около 3000 значений

Ответ №1:

Вам нужно отменить тестирование, разделить, а затем объединить обратно.

 update the_table
  set the_array = array(select t.val / 10 
                        from unnest(the_table.the_array) as t(val));
  

Если вам нужно сохранить исходный порядок в массиве, используйте with ordinality

 update the_table
  set the_array = array(select t.val / 10 
                        from unnest(the_table.the_array) with ordinality as t(val,idx) 
                        order by t.idx);
  

Чтобы запустить это в Liquibase, вам нужно использовать <sql> изменение

Онлайн-пример:https://rextester.com/IJGA96691

Комментарии:

1. Ты мой герой! Спасибо!