使用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...

当前回答

当我尝试更新字符串类型字段时,这对我有用。

UPDATE table_name 
SET body = jsonb_set(body, '{some_key}', to_json('value'::text)::jsonb);

希望它能帮助其他人!

假设表table_name有一个名为body的jsonb列,并且您想要更改body。Some_key = 'value'

其他回答

从PostgreSQL 14开始,你可以使用jsonb下标直接访问JSON字段的元素,并最终更新它们。

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

这似乎在PostgreSQL 9.5上有效

对于那些使用mybatis的人,这里有一个更新语句示例:

<update id="saveAnswer">
    update quiz_execution set answer_data = jsonb_set(answer_data, concat('{', #{qid}, '}')::text[], #{value}::jsonb), updated_at = #{updatedAt}
    where id = #{id}
</update>

参数:

Qid, field的键。 是一个有效的json字符串,对于字段值, 通过jackson将对象转换为json字符串,

遗憾的是,我没有在文档中找到任何东西,但您可以使用一些变通方法,例如您可以编写一些扩展函数。

例如,在Python中:

CREATE or REPLACE FUNCTION json_update(data json, key text, value json)
returns json
as $$
from json import loads, dumps
if key is None: return data
js = loads(data)
js[key] = value
return dumps(js)
$$ language plpython3u

然后

update test set data=json_update(data, 'a', to_json(5)) where data->>'b' = '2';

你可以尝试更新如下:

格式: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';