我有下表,postgresql 9.4
create table test( id serial, data json);
insert into test (data) values ('{"a":1, "b":['{"b1":1,"b2":2},{"b1":10,"b2":20}']}');
现在我需要更新b1的值,但仅当b1的当前值为10时(而不是值为1时)。 我看过各种各样的页面(A)How do I modify fields inside the new PostgreSQL JSON datatype? 以及9.5(B)http://michael.otacoo.com/postgresql-2/postgres-9-5-feature-highlight-new-jsonb-functions/
中的jsonb函数我从这些解释中没有理解的是我如何整合我的where子句,以便更新我需要更新的确切密钥。从集合函数和例子中读取:
CREATE OR REPLACE FUNCTION "json_object_set_key"(
"json" json,
"key_to_set" TEXT,
"value_to_set" anyelement
)
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT concat('{', string_agg(to_json("key") || ':' || "value", ','), '}')::json
FROM (SELECT *
FROM json_each("json")
WHERE "key" <> "key_to_set"
UNION ALL
SELECT "key_to_set", to_json("value_to_set")) AS "fields"
$function$;
如何将它与where子句一起使用?这将在9.5中使用jsonb_set吗? 我目前的解决方案是从数据库中获取json,在我的程序中修改它并使用新的json更新列。它不会经常发生,所以它不会花费太多。但如果我能理解如何做到这一点,我宁愿选择更优雅的解决方案 非常感谢
答案 0 :(得分:0)
我不确定json,但你可以像这样修改jsonb;
update objects set body=jsonb_set(body, '{name}', '"Mary"', true) where id=1;
其中body是jsonb col