2016-09-06 5 views
1

임시 테이블을 사용하지 않도록 배열에서 테이블 필드를 업데이트하는 방법은 무엇입니까? 사용자가 배열을 재정렬 테이블에 전달합니다.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으로 시작하고 간격이없는 것으로 가정합니다.

관련 문제