gpt4 book ai didi

arrays - Postgres/JSON - 更新所有数组元素

转载 作者:行者123 更新时间:2023-11-29 11:54:07 26 4
gpt4 key购买 nike

给定以下 json:

{
"foo": [
{
"bar": true
},
{
"bar": true
}
]
}

如何选择以下内容:

{
"foo": [
{
"bar": false
},
{
"bar": false
}
]
}

?

到目前为止,我已经想出了如何操作单个数组值:

SELECT
jsonb_set(
'{
"foo": [
{
"bar": true
},
{
"bar": true
}
]
}'::jsonb, '{foo,0,bar}', to_jsonb(false)
)

但是如何设置数组中的所有元素呢?

最佳答案

您可能想一石二鸟 - 更新数组中每个对象中的现有键或插入具有给定值的键。 jsonb_set 在这里是绝配,但是它需要我们传递每个对象的索引,所以我们必须先遍历数组。

实现受到 klin 的回答的高度启发,它没有解决我的问题(正在更新和插入)并且如果对象中有多个键则不起作用。所以,实现如下:

-- the params are the same as in aforementioned `jsonb_set`
CREATE OR REPLACE FUNCTION update_array_elements(target jsonb, path text[], new_value jsonb)
RETURNS jsonb language sql AS $$
-- aggregate the jsonb from parts created in LATERAL
SELECT jsonb_agg(updated_jsonb)
-- split the target array to individual objects...
FROM jsonb_array_elements(target) individual_object,
-- operate on each object and apply jsonb_set to it. The results are aggregated in SELECT
LATERAL jsonb_set(individual_object, path, new_value) updated_jsonb
$$;

就是这样......:)

我希望它能帮助遇到同样问题的人。

关于arrays - Postgres/JSON - 更新所有数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42276968/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com