更新数组内的复合类型

Update composite type inside array

有没有简单的方法来更新数组中的复合类型?

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

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

我想更新所有 order_itemsstatus。当大于1时,应更新所有status + 1

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

UPDATE mytab SET complex_col.r = (complex_col).r + 1;

但是,我想在内部数组中做同样的事情。

问题的根源在于关系设计。规范化模式(在 1:n 关系中单独的 table )将比数组列更干净,并且更容易索引或更新等。也几乎不会在磁盘上占用更多 space,数组开销类似于行开销。

虽然坚持你不幸的设计,但你必须取消嵌套数组,更新并返回聚合,注意不要在每一步都破坏东西:

I want to update the status of all order_items. When it's greater than 1, all status should be updated + 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;

元素的顺序 可能 不会改变,但没有 ORDER BY.
就无法保证 要保证元素的原始顺序:

  • PostgreSQL unnest() with element number