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;
我的 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;