我有以下名为value的JSONB列。
create temp table settings as
select
'{"favorites": [
{
"listings": [
{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1},
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3},
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd333", "version": 2}
]
}
]}'::jsonb as value;
所以我试图从这个嵌套数组中删除项目并重新构建它
select jsonb_set(value,'{favorites}',jsonb_set('{}','{listings}',
jsonb_agg(new_elems)) ) as ne from settings s ,
lateral ( select jsonb_array_elements(elem->'listings')as new_elems
from jsonb_array_elements(value->'favorites')elem) sets where
sets.new_elems->>'id' != 'aa92f346-7a93-4443-949b-4eab0badd983'
group by s.value
哪个有效,但"收藏夹"阵列被夷为平地。
而不是
"{"favorites": [{"listings": [{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}, {"id": "cd92e346-6b04-3456-050a-5eeb0bddd333", "version": 2}]}]}"
我得到了
"{"favorites": {"listings": [{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}, {"id": "cd92e346-6b04-3456-050a-5eeb0bddd333", "version": 2}]}}"
有没有人知道如何解决这个问题?。
答案 0 :(得分:1)
您可以使用函数JSONB_AGG
或JSON_BUILD_ARRAY
创建jsonb数组。 JSONB_AGG
是一个聚合函数,而JSONB_BUILD_ARRAY
将所有提供的参数放在一个数组中。
下面,我使用JSONB_BUILD_ARRAY
将favorites
转换为json数组而不是键值
SELECT
JSONB_SET(
'{}', '{favorites}',
JSONB_BUILD_ARRAY(
JSONB_SET('{}', '{listings}', JSONB_AGG(listings))
)
)
FROM settings,
LATERAL (SELECT
JSONB_ARRAY_ELEMENTS(JSONB_ARRAY_ELEMENTS(value->'favorites')->'listings') listings
FROM settings) listings
WHERE listings.listings->>'id' != 'aa92f346-7a93-4443-949b-4eab0badd983'