首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >postgresql、jsonb字段、通过jsonb_set和jsonb_array_length附加的数组

postgresql、jsonb字段、通过jsonb_set和jsonb_array_length附加的数组
EN

Stack Overflow用户
提问于 2016-11-30 11:02:34
回答 1查看 3.5K关注 0票数 0

我有postgresql和始终包含数组的jsonb字段。我需要向该数组追加新值,或者按索引更新已经存在的值。

看来jsonb_set函数符合我的要求。而对于追加新元素,我只需要最大限度的数组索引和更新元素与它。但我做这件事有困难。让我们一步一步地做。我们有jsonb字段team_members的桌面战役。

代码语言:javascript
复制
 select id, jsonb_set(team_members, '{0}', '{"name" : "123"}') from campaigns;
 id  |     jsonb_set     
 -----+-------------------
 102 | [{"name": "123"}]

好的,如果设置路径'{0}‘静态地一切正常。让我们动态地去做。

获取数组长度的SQL (它是我们附加的索引)

代码语言:javascript
复制
  select  '{' || jsonb_array_length(team_members) || '}'::text from campaigns;
  ?column? 
  ----------
  {0}

聚在一起

代码语言:javascript
复制
   select jsonb_set(team_members, '{' || jsonb_array_length(team_members) || '}', '{"name" : "123"}') from campaigns;

ERROR:函数jsonb_set(jsonb,文本,未知)不存在第1行:选择jsonb_set(team_members,'{‘\x’\jsonb_array_length(Tea)。^提示:没有任何函数与给定的名称和参数类型匹配。你可能会

需要添加显式类型转换。

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

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-30 11:32:42

像这样吗..

代码语言:javascript
复制
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)

就你的情况而言,应该是:

代码语言:javascript
复制
select 
  jsonb_set(
    team_members
  , concat('{',jsonb_array_length(team_members),'}')::text[]
  , '{"name" : "123"}'
  ) 
from campaigns;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40886670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档