当前位置: 首页 > 知识库问答 >
问题:

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

乜华翰
2023-03-14

我有带有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个答案

雷骁
2023-03-14

像这样的?..

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;
 类似资料:
  • 我正在使用(https://github.com/typeorm/typeorm)作为ORM库来连接postgresql数据库。我将几列保存为类型。现在我需要支持部分更新json数据,例如, 如果我只更新,我不想在更新语句中覆盖lastName。支持,我可以使用它来部分更新字段,但我如何使它与图书一起工作?

  • 问题内容: 在Postgresql 9.5中,是否可以重命名jsonb字段中的属性? 例如: 应该重命名为 问题答案: 在使用删除( - )并连接(||)运算符 ,如:

  • 我有一个php表单,用一个字段向URL发布数据,问题是我只能提交一个值。我有一个条形码扫描器,我想能够扫描多个序列号条形码,并提交表格。我可能需要一个javascript,但我不确定。见下文 所以换句话说,我想要一个表单字段,在那里我可以输入多个序列号,并能够将数据发布到URL。由于我使用条形码扫描器,它也提交回车键后,每次扫描,所以我想要能够添加多个序列,而不触摸键盘,当完成时,应该能够点击提交

  • 我使用一个自定义搜索函数的ajax查询,返回超文本标记语言数据成功调用。我想把这个数据附加到已经在页面上初始化的jQuery数据表中。当页面加载jQuery可数据显示,但是当我启动搜索功能,数据被附加到可数据,但不是排序,可搜索形式的可数据用户界面。ajax调用工作和数据返回时,我把成功的调用到console.log. 以下是HTML: 下面是带有Ajax调用的JQuery: }); 这是从aja

  • 问题内容: 我正在使用ajax提交包含数组,文本字段和文件的多部分表单。 我将每个VAR附加到主数据中 然后我使用ajax函数将其发送到PHP文件以存储在sql DB中。 但是在PHP方面,变量(即数组)显示为字符串。 当我不使用ajax作为表单数据发送它,而是使用简单的选项时,确实在PHP端将它作为数组获得,但是后来我也无法发送文件。 有什么办法吗? 问题答案: 您有几种选择: 将其转换为JSO

  • 问题内容: 如果类型不匹配,可以将一些元素追加到elasticsearch字段吗?如果我有这样的文件: 而且我想像这样附加另一个标签字段“蓝色”: 我想要的结果类似于: 我知道这个: 用于将字符串追加到另一个字符串 还有这个: 用于将另一个元素追加到列表。那么有什么办法可以将另一个元素附加到字符串字段呢?谢谢您的任何建议。 问题答案: 您可以做的是添加针对字段类型的测试,然后将其转换为数组。该脚本