我的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(茶... ^提示:没有函数匹配给定的名称和参数类型。你可能
需要添加显式类型转换。
我的问题是 - 如何摆脱这个错误?我做错了什么?
提前致谢。
答案 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;