【问题标题】:postgresql JSONB update key with a where clause带有 where 子句的 postgresql JSONB 更新键
【发布时间】: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


    【解决方案1】:

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

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

    body 是一个 jsonb col

    【讨论】:

    • 很久以后才回来。这不起作用,因为当 id 不是外部的 jsonb 的一部分时,我需要检查“id”。我保留了我的外部功能,因为它很少这样做,所以它不会花费太多。 N 优雅但有效
    猜你喜欢
    • 2015-07-09
    • 2018-11-12
    • 2018-05-26
    • 2017-11-18
    • 2021-12-07
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多