postgres - 更新 jsonb 数组的语法
postgres - syntax for updating a jsonb array
我正在努力寻找在 postgres 9.6.6 的 jsonb 列中更新数组的正确语法
给定一列 "comments",例如:
[
{
"Comment": "A",
"LastModified": "1527579949"
},
{
"Comment": "B",
"LastModified": "1528579949"
},
{
"Comment": "C",
"LastModified": "1529579949"
}
]
如果我想将 Z 附加到每个评论(给出 AZ、BZ、CZ)。
我知道我需要使用 jsonb_set(comments, '{"Comment"}',
关于完成这个的任何提示?
谢谢。
尝试:
UPDATE elbat
SET comments = array_to_json(ARRAY(SELECT jsonb_set(x.original_comment,
'{Comment}',
concat('"',
x.original_comment->>'Comment',
'Z"')::jsonb)
FROM (SELECT jsonb_array_elements(elbat.comments) original_comment) x))::jsonb;
它使用 jsonb_array_elements()
来设置数组元素,使用 jsonb_set()
对它们应用更改,将其转换为数组并使用 [=14= 返回 json
].
但这需要大量工作。好的,也许有一个更优雅的解决方案,但我没有找到。但是由于您的 JSON 似乎有一个固定的架构,我建议重新设计以关系方式进行,并为评论提供一个简单的 table 以及一个链接 table评论所在的对象。在这样的模型中,这种变化肯定会非常非常容易。
查找返回预期结果的查询:
select jsonb_agg(value || jsonb_build_object('Comment', value->>'Comment' || 'Z'))
from my_table
cross join jsonb_array_elements(comments);
jsonb_agg
-----------------------------------------------------------------------------------------------------------------------------------------------------
[{"Comment": "AZ", "LastModified": "1527579949"}, {"Comment": "BZ", "LastModified": "1528579949"}, {"Comment": "CZ", "LastModified": "1529579949"}]
(1 row)
根据上述查询创建一个简单的 SQL 函数:
create or replace function update_comments(jsonb)
returns jsonb language sql as $$
select jsonb_agg(value || jsonb_build_object('Comment', value->>'Comment' || 'Z'))
from jsonb_array_elements()
$$;
使用函数:
update my_table
set comments = update_comments(comments);
我正在努力寻找在 postgres 9.6.6 的 jsonb 列中更新数组的正确语法
给定一列 "comments",例如:
[
{
"Comment": "A",
"LastModified": "1527579949"
},
{
"Comment": "B",
"LastModified": "1528579949"
},
{
"Comment": "C",
"LastModified": "1529579949"
}
]
如果我想将 Z 附加到每个评论(给出 AZ、BZ、CZ)。
我知道我需要使用 jsonb_set(comments, '{"Comment"}',
关于完成这个的任何提示?
谢谢。
尝试:
UPDATE elbat
SET comments = array_to_json(ARRAY(SELECT jsonb_set(x.original_comment,
'{Comment}',
concat('"',
x.original_comment->>'Comment',
'Z"')::jsonb)
FROM (SELECT jsonb_array_elements(elbat.comments) original_comment) x))::jsonb;
它使用 jsonb_array_elements()
来设置数组元素,使用 jsonb_set()
对它们应用更改,将其转换为数组并使用 [=14= 返回 json
].
但这需要大量工作。好的,也许有一个更优雅的解决方案,但我没有找到。但是由于您的 JSON 似乎有一个固定的架构,我建议重新设计以关系方式进行,并为评论提供一个简单的 table 以及一个链接 table评论所在的对象。在这样的模型中,这种变化肯定会非常非常容易。
查找返回预期结果的查询:
select jsonb_agg(value || jsonb_build_object('Comment', value->>'Comment' || 'Z'))
from my_table
cross join jsonb_array_elements(comments);
jsonb_agg
-----------------------------------------------------------------------------------------------------------------------------------------------------
[{"Comment": "AZ", "LastModified": "1527579949"}, {"Comment": "BZ", "LastModified": "1528579949"}, {"Comment": "CZ", "LastModified": "1529579949"}]
(1 row)
根据上述查询创建一个简单的 SQL 函数:
create or replace function update_comments(jsonb)
returns jsonb language sql as $$
select jsonb_agg(value || jsonb_build_object('Comment', value->>'Comment' || 'Z'))
from jsonb_array_elements()
$$;
使用函数:
update my_table
set comments = update_comments(comments);