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

时间:2016-11-30 11:02:35

标签: sql arrays postgresql jsonb

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

看起来jsonb_set功能符合我的要求。并且为了追加新元素我只需要max array index和update元素。 但我这样做有困难。让我们一步一步来。 我们与jsonb field 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(茶...              ^提示:没有函数匹配给定的名称和参数类型。你可能

需要添加显式类型转换。

我的问题是 - 如何摆脱这个错误?我做错了什么?

提前致谢。

1 个答案:

答案 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;