2016-07-28 89 views
1

我有對象的數組,看起來像這樣的表的jsonb value列中:查找Postgres的jsonb數組對象的位置

"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當中?

回答

3

實施例的數據:

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 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) 

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從數組中刪除該對象

+0

謝謝,我正在尋找數組中的那個對象的索引。 – MattDionis

+0

我不得不仔細閱讀這個問題,對不起。我希望編輯的答案現在反映了真正的問題。 – klin