带有where子句的postgresql JSONB更新密钥

时间:2015-12-01 14:11:15

标签: json postgresql

我有下表,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更新列。它不会经常发生,所以它不会花费太多。但如果我能理解如何做到这一点,我宁愿选择更优雅的解决方案 非常感谢

1 个答案:

答案 0 :(得分:0)

我不确定json,但你可以像这样修改jsonb;

update objects set body=jsonb_set(body, '{name}', '"Mary"', true) where id=1; 

其中body是jsonb col