使用postgresql 9.3我可以选择JSON数据类型的特定字段,但如何使用UPDATE修改它们?我在postgresql文档或网上任何地方都找不到这样的例子。我尝试了一些显而易见的方法:

postgres=# create table test (data json);
CREATE TABLE
postgres=# insert into test (data) values ('{"a":1,"b":2}');
INSERT 0 1
postgres=# select data->'a' from test where data->>'b' = '2';
 ?column?
----------
 1
(1 row)
postgres=# update test set data->'a' = to_json(5) where data->>'b' = '2';
ERROR:  syntax error at or near "->"
LINE 1: update test set data->'a' = to_json(5) where data->>'b' = '2...

当前回答

在9.5中使用jsonb_set-

UPDATE objects
SET body = jsonb_set(body, '{name}', '"Mary"', true)
WHERE id = 1; 

其中body是jsonb列类型。

其他回答

在Postgresql 9.5中,可以执行以下命令-

UPDATE test
SET data = data - 'a' || '{"a":5}'
WHERE data->>'b' = '2';

OR

UPDATE test
SET data = jsonb_set(data, '{a}', '5'::jsonb);

有人问如何一次更新jsonb值中的多个字段。假设我们创建一个表:

CREATE TABLE testjsonb ( id SERIAL PRIMARY KEY, object JSONB );

然后我们插入一个实验行:

INSERT INTO testjsonb
VALUES (DEFAULT, '{"a":"one", "b":"two", "c":{"c1":"see1","c2":"see2","c3":"see3"}}');

然后我们更新行:

UPDATE testjsonb SET object = object - 'b' || '{"a":1,"d":4}';

它的作用如下:

更新a字段 删除b字段 添加d字段

选择数据:

SELECT jsonb_pretty(object) FROM testjsonb;

会导致:

      jsonb_pretty
-------------------------
 {                      +
     "a": 1,            +
     "c": {             +
         "c1": "see1",  +
         "c2": "see2",  +
         "c3": "see3",  +
     },                 +
     "d": 4             +
 }
(1 row)

要更新里面的字段,不要使用concat操作符||。请改用jsonb_set。这并不简单:

UPDATE testjsonb SET object =
jsonb_set(jsonb_set(object, '{c,c1}','"seeme"'),'{c,c2}','"seehim"');

使用concat操作符{c,c1},例如:

UPDATE testjsonb SET object = object || '{"c":{"c1":"seedoctor"}}';

将移除{c,c2}和{c,c3}。

要获得更强大的功能,请查看postgresql json函数文档。有人可能会对#-操作符、jsonb_set函数和jsonb_insert函数感兴趣。

这个解决方案是jsonb_set的替代方案,即使JSONB的列中有NULL,它也能工作。只有当对象存在时,jsonb_set才有效。

在下面的示例中,settings是用户表上的JSONB列。

 UPDATE public."Users"
 SET settings = coalesce("settings", '{}')::jsonb || '{ "KeyToSet" : "ValueToSet" }'
 WHERE id=35877;

UPDATE table_name SET attrs = jsonb_set(cast(attrs as jsonb), '{key}', '"new_value"', true) WHERE id = 'some_id';

这对我有用,attrs是一个json类型的字段。首先转换为jsonb,然后更新。

or

UPDATE table_name SET attrs = jsonb_set(cast(attrs as jsonb), '{key}', '"new_value"', true) WHERE attrs->>key = 'old_value';

如果你想在你的JSON更新命令中使用其他列的值,你可以使用字符串连接:

UPDATE table
SET column1 = column1::jsonb - 'key' || ('{"key": ' || column2::text ||  '}')::jsonb
where ...;

你可以尝试更新如下:

格式:UPDATE table_name SET column_name = column_name::jsonb || '{"key":new_value}' WHERE column_name条件;

举个例子:

UPDATE test SET data = data::jsonb || '{"a":new_value}' WHERE data->>'b' = '2';