首页 文章

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

提问于
浏览
1

我有下表,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

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

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

    身体是jsonb col

相关问题