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 に答える