【问题标题】:PostgreSql: how to update table from array?PostgreSql:如何从数组更新表?
【发布时间】:2017-01-13 13:40:15
【问题描述】:

如何从数组中更新表字段以避免临时表使用? 用户将数组传递给重新排序表。

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

【问题讨论】:

  • 可以更具体一点吗?如何希望update 发生?我无法从您的问题中弄清楚,var_array 只是integers 的列表。
  • 输入数组中的索引是对应的旧位置。正如我从下面的答案中看到的那样,“序数”是正确的方法

标签: postgresql


【解决方案1】:

假设数组中的索引对应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 并且没有间隙。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2012-12-22
    相关资源
    最近更新 更多