1

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

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

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

我想更新status所有order_items. 当它大于 时1,都status应该更新+ 1

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

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

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

4

1 回答 1

2

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

在坚持您不幸的设计时,您必须取消嵌套数组,更新和聚合回来,注意不要在每一步都破坏:

我想更新status所有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;

元素的顺序可能不会改变,但没有ORDER BY.
为了保证元素的原始顺序:

于 2016-04-11T16:43:04.343 回答