在postgres中更新json数组

时间:2017-01-11 14:44:46

标签: json postgresql

我有一个如下所示的数据字段:

{ "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}]';

但是我收到错误:“->

附近的语法错误

缺少什么?

2 个答案:

答案 0 :(得分:2)

修复拼写错误

怀疑它。这不是有效的json。 name1name2必须加双引号。为了便于使用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}]
  }
$$);

更新JSON

现在它可以工作..现在您可以根据需要更新它..

UPDATE t_json
SET t_data = jsonb_set(
  t_data::jsonb,
  '{field1}',
  $${"whatever":1}$$
);

从JSON更改为JSONB

请注意,我们必须转发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[]`