2016-09-06 15 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

少し具体的ですか?この 'update'をどのようにしたいのですか?私はあなたの質問からそれを理解することはできません、 'var_array'は'整数 'の単なるリストです。 – 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_order0を開始し、ギャップがないことを前提としています。

関連する問題