更新数组

时间:2016-04-11 14:39:30

标签: sql arrays postgresql sql-update unnest

是否有一种简单的方法来更新数组中的复合类型?

目前我有下表(我截断了其他字段):

CREATE TYPE order_item AS (delivery_date DATE, status INT);
CREATE TABLE demo (id SERIAL PRIMARY KEY, data order_item[]);

我想更新所有status的{​​{1}}。如果大于order_items,则应更新所有1 status

对于没有数组字段的表,这很容易:

+ 1

但是,我想在数组中执行相同的

1 个答案:

答案 0 :(得分:1)

问题的根源是关系设计。标准化模式(1:n关系中的单独表)将比数组列更清晰,更容易索引或更新等。磁盘上也不会占用更多空间,数组开销类似于行开销。

虽然坚持你的不幸设计,你必须取消阵列,更新和汇总,注意不要在每一步都破坏:

  

我想更新所有status的{​​{1}}。如果大于order_items,则应更新所有1 status

+ 1

元素的顺序可能不会改变,但没有UPDATE demo d SET data = x.data FROM ( SELECT d.id, array_agg((o.delivery_date , CASE WHEN o.status > 1 THEN o.status + 1 ELSE o.status END )::order_item) AS data FROM demo d LEFT JOIN LATERAL unnest(data) o ON true GROUP BY d.id HAVING count(*) FILTER (WHERE o.status > 1) > 0 ) x WHERE d.id = x.id; 没有保证。
保证元素的原始顺序: