繁体   English   中英

在 postgres jsonb 数组中查找对象的位置

[英]Find position of object in postgres jsonb array

我在表的 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM