繁体   English   中英

在postgres中更新json数组

[英]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。 name1name2必须用双引号引起来。 为了简化使用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}]
  }
$$);

进行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}$$
);

我想将其发布在这里,以防其他人受益。 除非您确实需要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM