2016-09-06 4 views
1

Как обновить поля таблицы из массива, чтобы избежать использования таблицы temp? Пользователь передает массив для переупорядочения таблицы.PostgreSql: как обновить таблицу из массива?

create TABLE items 
(
id serial primary key, 
name text, 
select_order int 
) 

insert into items(name, select_order) 
values 
('cucumber',0), 
('milk',1), 
('coffee',2), 
('water',3) 

select * from items order by select_order; 

DO 
$body$ 
DECLARE var_array int[]:='{3,0,2,1}'; 
BEGIN 
update items ?? 

END; 
$body$ 

Окончательный результат в этом примере должны быть

select * from items order by select_order; 
name  select_order 
------------------------ 
water  0 
cucumber 1 
coffee  2 
milk  3 
+0

Может быть немного конкретнее? Как вы хотите, чтобы это «обновление» произошло? Я не могу понять это из вашего вопроса: «var_array» - это всего лишь список «integer's». – redneb

+0

Указатель во входном массиве - это соответствующая старая позиция. Как я вижу из ответов ниже, «обыденность» - это правильный путь – Oleg

ответ

2

Предполагая, что индекс в массиве соответствует значению в select_order следующий запрос возвращает новое и старое значение:

select i.id, i.select_order, t.new_sort 
from items i 
    join lateral unnest(array[3,0,2,1]) with ordinality as t(new_sort, idx) on t.idx - 1 = i.select_order 

Теперь это может быть использовано для обновления целевой таблицы:

update items 
    set select_order = r.new_sort 
from (
    select i.id, i.select_order, t.new_sort 
    from items i 
    join lateral unnest(array[3,0,2,1]) with ordinality as t(new_sort, idx) on t.idx - 1 = i.select_order 
) r 
where r.id = items.id; 

Это также предполагает, что select_order начинает 0 и не имеет пробелов.

Смежные вопросы