问题描述
列数据的类型为 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)
)