是否有一种简单的方法来更新数组中的复合类型?
目前我有下表(我截断了其他字段):
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
但是,我想在数组中执行相同的。
答案 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;
没有保证。
要保证元素的原始顺序: