无法使用前一个数组项的值将新项添加到数组
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)
)
列 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)
)