无法使用前一个数组项的值将新项添加到数组

Can't add new item to array with value from prev array's item

data 的类型为 jsonb

示例:

"availability": [
    {
      "qty": 31,
       "is_available": false,
      "store": {
        "name": "test_value
      }
    },

它包含数组 可用性 和一项。

我想向这个数组中添加新项目。并从第一项中获取节点 qty 的值。然后将此值添加到第二个(新)数组的项目。 结果 availability 将包含 2 件商品。节点 qty 必须在两项中相等。

我试试这个:

 WITH subquery AS (
    SELECT 
    id, 
    data #>>'{availability,0,qty}' as qty
    from copy_product
)
UPDATE copy_product 
SET
data = (
 jsonb_set(data, '{availability}', data -> 'availability' || '{
    "qty": subquery.qty,
    "is_available": false,
    "store": {
     "address": null
  }}')
)

但是我得到错误:

  ERROR:  invalid input syntax for type json
LINE 10: ...onb_set(data, '{availability}', data -> 'availability' || '{
                                                                      ^
DETAIL:  Token "subquery" is invalid.
CONTEXT:  JSON data, line 1: {
    "qty": subquery...
SQL state: 22P02
Character: 190

无需 sub-query(甚至 CTE),您可以直接引用现有值作为传递给 jsonb_set()

的表达式的一部分
UPDATE copy_product 
  SET data = jsonb_set(data, 
                       '{availability}', 
                       data -> 'availability' 
                        || ('{"qty": '||(data #>>'{availability,0,qty}')||', "is_available": false, "store": {"address": null}}')::jsonb)

或者使用 jsonb_build_object()

UPDATE copy_product 
  SET data = jsonb_set(data, 
                       '{availability}', 
                       data -> 'availability' || 
                                jsonb_build_object(
                                     'qty', data #>>'{availability,0,qty}', 
                                     'is_available', false, 
                                     'store', jsonb_build_object('address', null)
                                )