【发布时间】:2016-03-05 11:57:56
【问题描述】:
我有下表,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 子句,以便它更新我需要更新的确切密钥。从 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 postgresql