2016-11-30 72 views
0

我有postgresql與總是包含數組的jsonb字段。 我需要將新值附加到該數組或通過索引更新已經存在的值。postgresql,jsonb字段,數組追加通過jsonb_set和jsonb_array_length

看起來像jsonb_set功能符合我的要求。爲了追加新元素,我只需要最大數組索引和更新元素。 但是我做這件事很麻煩。讓我們一步一步來。 我們有jsonb字段team_members的表格廣告系列。

select id, jsonb_set(team_members, '{0}', '{"name" : "123"}') from campaigns; 
id |  jsonb_set  
-----+------------------- 
102 | [{"name": "123"}] 

好的很好,如果設置路徑「{0}」靜態一切正常。 讓我們做得到數組長度動態

SQL(這是我們可以進行追加指數)

select '{' || jsonb_array_length(team_members) || '}'::text from campaigns; 
    ?column? 
    ---------- 
    {0} 

讓所有一起

select jsonb_set(team_members, '{' || jsonb_array_length(team_members) || '}', '{"name" : "123"}') from campaigns; 

錯誤:功能jsonb_set(jsonb,文字,未知)不存在 LINE 1:select jsonb_set(team_members,'{'|| jsonb_array_length (茶... ^提示:沒有函數匹配給定的名稱和參數類型。你可能會

需要添加明確的類型轉換。

我的問題是 - 我該如何擺脫這個錯誤?我做錯了什麼?

在此先感謝。 ?

+0

如果要追加,''||是給你 –

+0

對不起,我更合適的人選米不知道我跟着你,你能告訴我例如嗎? – user1341596

+0

起初我並不瞭解你與索引的一部分。現在我想我明白了。並在回答 –

回答

1

這樣的事情..

t=# with jpath as (select concat('{',0,'}')::text[] path) select jsonb_set('[]'::jsonb,path,'{"name": "123"}'::jsonb) from jpath; 
    jsonb_set 
------------------- 
[{"name": "123"}] 
(1 row) 

在你的情況應該是這樣的:

select 
    jsonb_set(
    team_members 
    , concat('{',jsonb_array_length(team_members),'}')::text[] 
    , '{"name" : "123"}' 
) 
from campaigns; 
+0

太棒了!我不知道concat。 只有一個時刻:CONCAT( '{',jsonb_array_length(team_members), '}')::文本[] 你忘了後冒號) 謝謝 – user1341596

+0

@ user1341596是,投,謝謝 –