json - 带有 where 子句的 postgresql JSONB 更新键

标签 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) 中的 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/

相关文章:

json - Firebase 数据库规则 UID 所有访问

javascript - 查找 JSON 值是否包含特定文本

json - 编码 JSON 时如何内联字段?

带有 key :object 的 JavaScript json

c# - 从 ASP.Net vNext 使用 PostgreSQL

javascript - 插入查询的语法不正确

postgresql - psql 在启动时挂起

sql - 在 SQL 中存储对象的动态属性

java - 您已在存储库中定义查询方法,但未定义任何查询查找策略。 Spring

json - Postgres - 选择大型 jsonb 列的性能