[英]postgresql, jsonb field, array append via jsonb_set and jsonb_array_length
我有jsonb字段的postgresql總是包含數組。 我需要將新值附加到該數組或通過索引更新已經存在的值。
看起來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,text,unknown)不存在第1行:選擇jsonb_set(team_members,'{'|| jsonb_array_length(tea ... ^提示:沒有函數與給定的名稱和參數類型匹配。您可能
需要添加顯式類型轉換。
我的問題是-我如何擺脫這個錯誤? 我做錯了什么?
提前致謝。
像這樣嗎?
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.