JSONBフィールド値の合計に基づくPostgresql更新レコード列

rovnyart_

Postgresql 9.6.5に、次のようなフィールドを持つテーブルがあります

CREATE TABLE test (
  id SERIAL,
  data JSONB,
  amount DOUBLE PRECESION,
  PRIMARY KEY(id)
);

data列このようなJSONオブジェクトがあります。

{
"Type": 1,
  "CheckClose":
    {"Payments":
      [
        {"Type": 4, "Amount": 2068.07},
        {"Type": 1, "Amount": 1421.07}
      ]
    }
}

私がする必要があるのはamountこのオブジェクトAmountPaymentsフィールド値の合計を各行のフィールドに入れるdataことです。たとえば、この特定のオブジェクトの場合、2068.07 + 1421.07 = 3489.14である必要があります私はPostgresのjson関数とjsonb関数についていくつか読んだので、今ここにいます:

UPDATE test SET amount=sum((jsonb_array_elements(data::jsonb->'CheckClose'->'Payments')->>'Amount')::FLOAT)

それは機能していません-UPDATEで集計関数を使用しないことについてエラーが発生します。

私はこれを次のようにしようとしました:

UPDATE test SET amount=temp.sum
  FROM (
     SELECT sum((jsonb_array_elements(data::jsonb->'CheckClose'->'Payments')->>'Amount')::FLOAT) AS "sum"
    FROM test WHERE id=test.id
  ) as "temp"

エラーが発生しました set-valued function called in context that cannot accept a set

どうすればよいですか?合計を計算して別の行に入れる必要がありますが、それは難しい作業ですか?誰か、私がこれを理解するのを手伝ってください。ありがとう。

ヴァオツン

fn()集計を返すセットtry:

t=# with c(j) as (values('{"Payments":
      [
        {"Type": 4, "Amount": 2068.07},
        {"Type": 1, "Amount": 1421.07}
      ]
    }'::jsonb))
select sum((jsonb_array_elements(j->'Payments')->>'Amount')::float) from c;

エラー:

ERROR:  aggregate function calls cannot contain set-returning function calls
LINE 7: select sum((jsonb_array_elements(j->'Payments')->>'Amount'):...
                    ^
HINT:  You might be able to move the set-returning function into a LATERAL FROM item.

別のcteによって簡単に克服することができます:

t=# with c(j) as (values('{"Payments":
      [
        {"Type": 4, "Amount": 2068.07},
        {"Type": 1, "Amount": 1421.07}
      ]
    }'::jsonb))
, a as (select (jsonb_array_elements(j->'Payments')->>'Amount')::float am from c)
select sum(am) from a;
   sum
---------
 3489.14
(1 row)

だから今CTEから更新するだけです:

with s as (SELECT ((jsonb_array_elements(data::jsonb->'CheckClose'->'Payments')->>'Amount')::FLOAT) AS "sm", id
    FROM test
)
, a as (select sum(sm), id from s group by id)
UPDATE test SET amount = sum
FROM a
WHERE id=test.id

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

フィールドに基づくAwk合計csv列

分類Dev

部品番号に基づく数量フィールドのAngularJS合計値

分類Dev

列の値に基づくmysqlグループレコード

分類Dev

別のフィールドの合計に基づいてSQLiteブールフィールドを更新する

分類Dev

フィールド値に基づくDjangoQuerySet集計

分類Dev

属性値に基づくフィールド計算機

分類Dev

フィールド値に基づくawk計算

分類Dev

文字列PowerBIに基づくフィルターとの合計

分類Dev

条件に基づいてフィールドの多くのmongoDBレコードを更新する

分類Dev

reactadminのレコードに基づくフィールド/入力ラベル

分類Dev

複数のフィールドに基づくレコードの検索

分類Dev

postgresql:複数の値を持つ配列フィールド値に基づいてレコードを検索します

分類Dev

2つの<select>値に基づくフィールドの自動更新

分類Dev

フィールドの値に基づくJavascript任意のソート配列

分類Dev

別のフィールドの条件に基づくSQL更新フィールド

分類Dev

他の列の値に基づくフォワードフィル

分類Dev

フィールドレベルの値の変更に基づくHibernateEnvers

分類Dev

派生列の値に基づくレコードの検索

分類Dev

列の値フィールドに基づいてレコードを分割する方法

分類Dev

他のフィールド値に基づくフィールドの違い?

分類Dev

別のテーブルのコードと値のルックアップに基づくExcelの合計

分類Dev

フィールドの累積合計に基づく要素のフィルタリング

分類Dev

特定のフィールド値に基づくSQLの選択

分類Dev

bashのフィールド値に基づいて列を統合する

分類Dev

フィールド数unixに基づくグループレコード

分類Dev

合計より少ない指定されたレコード数に基づいてフィールドを更新します(たとえば、5000レコードのうち1000レコード)

分類Dev

SQL-計算フィールドに基づく計算フィールド?

分類Dev

フィールド値に基づく代替行の色

分類Dev

フィールド値に基づく代替行の色

Related 関連記事

  1. 1

    フィールドに基づくAwk合計csv列

  2. 2

    部品番号に基づく数量フィールドのAngularJS合計値

  3. 3

    列の値に基づくmysqlグループレコード

  4. 4

    別のフィールドの合計に基づいてSQLiteブールフィールドを更新する

  5. 5

    フィールド値に基づくDjangoQuerySet集計

  6. 6

    属性値に基づくフィールド計算機

  7. 7

    フィールド値に基づくawk計算

  8. 8

    文字列PowerBIに基づくフィルターとの合計

  9. 9

    条件に基づいてフィールドの多くのmongoDBレコードを更新する

  10. 10

    reactadminのレコードに基づくフィールド/入力ラベル

  11. 11

    複数のフィールドに基づくレコードの検索

  12. 12

    postgresql:複数の値を持つ配列フィールド値に基づいてレコードを検索します

  13. 13

    2つの<select>値に基づくフィールドの自動更新

  14. 14

    フィールドの値に基づくJavascript任意のソート配列

  15. 15

    別のフィールドの条件に基づくSQL更新フィールド

  16. 16

    他の列の値に基づくフォワードフィル

  17. 17

    フィールドレベルの値の変更に基づくHibernateEnvers

  18. 18

    派生列の値に基づくレコードの検索

  19. 19

    列の値フィールドに基づいてレコードを分割する方法

  20. 20

    他のフィールド値に基づくフィールドの違い?

  21. 21

    別のテーブルのコードと値のルックアップに基づくExcelの合計

  22. 22

    フィールドの累積合計に基づく要素のフィルタリング

  23. 23

    特定のフィールド値に基づくSQLの選択

  24. 24

    bashのフィールド値に基づいて列を統合する

  25. 25

    フィールド数unixに基づくグループレコード

  26. 26

    合計より少ない指定されたレコード数に基づいてフィールドを更新します(たとえば、5000レコードのうち1000レコード)

  27. 27

    SQL-計算フィールドに基づく計算フィールド?

  28. 28

    フィールド値に基づく代替行の色

  29. 29

    フィールド値に基づく代替行の色

ホットタグ

アーカイブ