簡體   English   中英

PostgreSQL,jsonb字段,通過jsonb_set和jsonb_array_length追加的數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM