提问者:小点点

postgresql,jsonb字段,通过jsonb_set和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(它是append的索引)

  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...^提示:没有与给定名称和参数类型匹配的函数。您可以

需要添加显式类型转换。

我的问题是--我怎样才能摆脱这个错误?我做错了什么?

提前道谢。


共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;