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

问题描述

数据的类型为 jsonb

示例:

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

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

我想向该数组添加新项目。并从第一项获取节点 qty 的值。然后将此值添加到第二个(新)数组的项目中。 结果,可用性将包含2个项目。并且节点数量在两个项目中必须相等。

我尝试这个:

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

但是我得到了错误

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

解决方法

不需要子查询(甚至CTE),您可以直接将现有值作为传递给jsonb_set()的表达式的一部分来引用

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

或者使用jsonb_build_object()

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