使用特定键更新Postgres中的JSON数组
我有一个复杂的数组,在表列中如下所示:使用特定键更新Postgres中的JSON数组,json,postgresql,jsonb,Json,Postgresql,Jsonb,我有一个复杂的数组,在表列中如下所示: { "sometag": {}, "where": [ { "id": "Krishna", "nick": "KK", "values": [ "0" ], "function
{
"sometag": {},
"where": [
{
"id": "Krishna",
"nick": "KK",
"values": [
"0"
],
"function": "ADD",
"numValue": [
"0"
]
},
{
"id": "Krishna1",
"nick": "KK1",
"values": [
"0"
],
"function": "SUB",
"numValue": [
"0"
]
}
],
"anotherTag": [],
"TagTag": {
"tt": "tttttt",
"tt1": "tttttt"
}
在这个数组中,我想更新id“Krishna”的函数和numValue
请帮忙。这真的很糟糕,因为
功能
值。注意从typejson
到typejsonb
的强制转换。这是必要的,因为没有json\u set()
函数,只有jsonb\u set()
。当然,如果您只有类型jsonb
,则不需要强制转换numValue
valuewhere
值到目前为止你试过什么?你的预期产出是多少?为什么numValue是数组?numValue可以有多个值。预期输出:{“sometag”:{},其中:[{“id”:“Krishna”,“nick”:“KK”,“values”:[“0”],“function”:“ADDITION”,“numValue”:[“0”,“1”]},{“id”:“Krishna1”,“nick”:“kkk1”,“values”:[“0”],“function”:“SUB”,“numValue”:[“0”}],“anotherTag”:[“tag”:{“tt”:“tttttt”,“tt1”:“tttttt”}}使用正确规范化的数据模型,这会容易得多
SELECT
jsonb_set( -- 5
(SELECT mydata::jsonb FROM mytable),
'{where}',
updated_array
)::json
FROM (
SELECT
jsonb_agg( -- 4
CASE WHEN array_elem ->> 'id' = 'Krishna' THEN
jsonb_set( -- 3
jsonb_set(array_elem.value::jsonb, '{function}', '"ADDITION"'::jsonb), -- 2
'{numValue}',
'["0","1"]'::jsonb
)
ELSE array_elem::jsonb END
) as updated_array
FROM mytable,
json_array_elements(mydata -> 'where') array_elem -- 1
) s