在postgres jsonb数组中find对象的位置
我有一个在表的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)