#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. Ты мой герой! Спасибо!