postgresql,jsonb 字段,数组通过 jsonb_set 和 jsonb_array_length 追加

postgresql, jsonb field, array append via jsonb_set and jsonb_array_length

我的 postgresql 带有始终包含数组的 jsonb 字段。 我需要将新值附加到该数组或按索引更新现有值。

看起来jsonb_set功能符合我的要求。为了追加新元素,我只需要最大数组索引并用它更新元素。 但是我这样做有困难。让我们一步一步来。 我们有 table 个带有 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;

ERROR: function jsonb_set(jsonb, text, unknown) does not exist LINE 1: select jsonb_set(team_members, '{' || jsonb_array_length(tea... ^ HINT: No function matches the given name and argument types. You might

需要添加显式类型转换。

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

提前致谢。

类似这样的东西?..

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;