更新数组内的复合类型
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_items
的 status
。当大于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
有没有简单的方法来更新数组中的复合类型?
目前我有以下table(我截断了其他字段):
CREATE TYPE order_item AS (delivery_date DATE, status INT);
CREATE TABLE demo (id SERIAL PRIMARY KEY, data order_item[]);
我想更新所有 order_items
的 status
。当大于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 allorder_items
. When it's greater than1
, allstatus
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