我有一个如下所示的数据字段:
{ "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}]';
但是我收到错误:“->
缺少什么?
答案 0 :(得分:2)
怀疑它。这不是有效的json。 name1
和name2
必须加双引号。为了便于使用json,总是使用双引号。 始终使用双倍美元查询报价。
{ "field1" : [{"name":'name1',"value1":true},
{"name":'name2',"value2":false}
],
"field2" : [{"name":'name1',"value1":true},
{"name":'name2',"value2":false}
]
}
而且,INSERTED
也很时髦.. ALWAYS paste beautified valid JSON in your question.
{
"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}$$
);
答案 1 :(得分:2)
我想在这里发帖,以防其他人帮助。除非你真的需要JSONB为你提供的功能,否则一定要使用JSON而不是JSONB。通常,如果需要对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[]`