我有下表,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) 中的 jsonb 函数 http://michael.otacoo.com/postgresql-2/postgres-9-5-feature-highlight-new-jsonb-functions/
我没有从这些解释中理解的是我如何整合我的 where 子句以便它更新我需要更新的确切 key 。从 A 中读取 set 函数和示例:
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 更新列。它不会经常发生,因此不会花费太多。但我更喜欢一个更优雅的解决方案,如果我能理解如何去做的话 非常感谢
最佳答案
我不确定 json 但你可以像这样修改 jsonb;
update objects set body=jsonb_set(body, '{name}', '"Mary"', true) where id=1;
其中 body 是一个 jsonb col
关于json - 带有 where 子句的 postgresql JSONB 更新键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34022484/