[英]Update json array in postgres
我有一个看起来像这样的数据字段:
{ "field1" : [{"name":'name1',"value1":true},
{"name":'name2',"value2":false}
],
"field2" : [{"name":'name1',"value1":true},
{"name":'name2',"value2":false}
]
}
是否可以通过更新来更新特定字段?
create table t_json (
t_data json
);
insert into t_json values('{"field1":[{"name":"name1","value" : true},{"name":"name2","value" : false}],"field1":[{"name":"name1","value" : true},{"name":"name2","value" : false}]}');
select t_data->'field1'
from t_json;
我尝试了这个:
update t_json
set t_data->'a' = '[{"value1" : true, "value2" : false}]';
但我收到一个错误:“语法错误在或附近->
什么东西少了 ?
怀疑。 这是无效的json。 name1
和name2
必须用双引号引起来。 为了简化使用json的操作,请始终使用双引号。 始终用双美元查询报价。
{ "field1" : [{"name":'name1',"value1":true},
{"name":'name2',"value2":false}
],
"field2" : [{"name":'name1',"value1":true},
{"name":'name2',"value2":false}
]
}
而且,您INSERTED
内容也很时髦。. 始终在您的问题中粘贴美化的有效JSON。
{
"field1":[{"name":"name1","value" : true},{"name":"name2","value" : false}],
"field1":[{"name":"name1","value" : true},{"name":"name2","value" : false}]
}
让我们更改并修复它。
{
"field1":[{"name":"name1","value" : true},{"name":"name2","value" : false}],
"field2":[{"name":"name1","value" : true},{"name":"name2","value" : false}]
}
现在,将其放入查询中。
TRUNCATE t_json;
INSERT INTO t_json (t_data) VALUES ($$
{
"field1":[{"name":"name1","value" : true},{"name":"name2","value" : false}],
"field2":[{"name":"name1","value" : true},{"name":"name2","value" : false}]
}
$$);
现在它可以工作了。现在您可以根据需要对其进行更新了。
UPDATE t_json
SET t_data = jsonb_set(
t_data::jsonb,
'{field1}',
$${"whatever":1}$$
);
注意,我们必须转换为jsonb
。 通常, 切勿使用JSON(并非所有人都同意,请参见注释)。 无关紧要。 而是使用较新的JSONB。
ALTER TABLE t_json ALTER COLUMN t_data TYPE jsonb ;
现在你可以做
UPDATE t_json
SET t_data = jsonb_set(
t_data,
'{field1}',
$${"whatever":1}$$
);
我想将其发布在这里,以防其他人受益。 除非您确实需要JSONB为您提供的功能,否则请务必在JSONB上使用JSON。 通常,如果您需要对JSON数据本身执行查询,请使用JSONB。 如果只需要存储数据,请使用JSON。
无论如何,这是我如何更新JSON[]
字段:
UPDATE foo SET bar = ARRAY[$${"hello": "world"}$$, $${"baz": "bing"}$$]::JSON[]
需要注意的重要事项是:
ARRAY[ ... ]::JSON[]
$${ "foo": "bar" }$$
值得注意的是,这种相同的技术可以用于其他数组类型。 例如,如果您有一个text[]
列,查询将如下所示:
UPDATE foo SET bar = ARRAY[$$hello world$$, $$baz bing$$]::TEXT[]`
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.