在 postgres jsonb 数组中查找对象的位置
Find position of object in postgres jsonb array
我在 table:
的 jsonb value
列中有一个看起来像这样的对象数组
"west": [
{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1},
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}
]
我的目标是根据对象的 ID 和版本从该数组中删除某些对象,如下所示:
SELECT value::jsonb #- '{west, 1}' FROM game.settings;
但是,1
不应该是硬编码的,而应该等于对象在数组中的位置,它与我正在寻找的 id 和版本相匹配(在本例中 "id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3
).
我将如何确定这个数组位置并将其传递到我的硬编码 1
当前所在的位置?
示例数据:
create temp table settings as
select
'{"west": [
{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1},
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}
]}'::jsonb as value;
您可以使用jsonb_array_elements() with ordinality
来确定给定元素的数组位置:
select elem, position
from settings, jsonb_array_elements(value->'west') with ordinality arr(elem, position)
where elem->>'id' = 'cd92e346-6b04-3456-050a-5eeb0bddd027';
elem | position
--------------------------------------------------------------+----------
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3} | 2
(1 row)
使用position
从数组中删除对象:
select value #- array['west', (position- 1)::text] new_value
from settings, jsonb_array_elements(value->'west') with ordinality arr(elem, position)
where elem->>'id' = 'cd92e346-6b04-3456-050a-5eeb0bddd027';
new_value
--------------------------------------------------------------------------
{"west": [{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1}]}
(1 row)
我在 table:
的 jsonbvalue
列中有一个看起来像这样的对象数组
"west": [
{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1},
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}
]
我的目标是根据对象的 ID 和版本从该数组中删除某些对象,如下所示:
SELECT value::jsonb #- '{west, 1}' FROM game.settings;
但是,1
不应该是硬编码的,而应该等于对象在数组中的位置,它与我正在寻找的 id 和版本相匹配(在本例中 "id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3
).
我将如何确定这个数组位置并将其传递到我的硬编码 1
当前所在的位置?
示例数据:
create temp table settings as
select
'{"west": [
{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1},
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}
]}'::jsonb as value;
您可以使用jsonb_array_elements() with ordinality
来确定给定元素的数组位置:
select elem, position
from settings, jsonb_array_elements(value->'west') with ordinality arr(elem, position)
where elem->>'id' = 'cd92e346-6b04-3456-050a-5eeb0bddd027';
elem | position
--------------------------------------------------------------+----------
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3} | 2
(1 row)
使用position
从数组中删除对象:
select value #- array['west', (position- 1)::text] new_value
from settings, jsonb_array_elements(value->'west') with ordinality arr(elem, position)
where elem->>'id' = 'cd92e346-6b04-3456-050a-5eeb0bddd027';
new_value
--------------------------------------------------------------------------
{"west": [{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1}]}
(1 row)