【问题标题】:How to update keys in a JSON array Postgresql如何更新 JSON 数组 Postgresql 中的键
【发布时间】:2015-09-16 14:13:56
【问题描述】:

我正在使用 PostgreSQL 9.4.1 并且遇到了我需要更新的列的问题。该列是 JSON 类型,元素格式如下:

["a","b","c",...]
["a","c","d",...]
["c","d","e",...]

等等

这样每个元素都是一个字符串。据我了解,这些元素中的每一个都被认为是 JSON 数组的键(如果我在这里有点困惑,请纠正我,我以前从未使用过 JSON 数据类型列,所以我仍在努力掌握反正在他们身上)。这些数组没有实际的模式,它们的内容取决于其他地方的用户输入。我的目标是更新包含特定元素的任何数组(为了更彻底地解释我的问题,说“b”)并将内容“b”替换为“b1”。意思是:

["a","b","c",...]

将更新为

["a","b1","c",...]

我在这个网站上找到了一些方法(我目前没有链接,但如果有必要我可以再次找到它们)来更新特定 KEY 的值,但我还没有找到提到的方法更改 KEY 本身。我已经找到了一种方法来定位感兴趣的特定行,方法是:

    SELECT * 
    FROM TableA 
    WHERE column::json ?| ["b", other string elements of interest]

任何建议将不胜感激。谢谢你的帮助!

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    所以我继续进行检查(因为它看起来应该可以工作,而且或多或少是我最终做的事情),但我弄清楚了我想要做什么!我得到的是这样的:

    UPDATE TableA
    SET column = REPLACE(column::TEXT,'b','b1')::JSON
    WHERE column::JSON ?| ['b']
    

    现在我想起来了,我什至可能不需要最后一个 where 条件,因为替换不会影响任何没有“b”的东西。但这对我有用,看起来你的可能也应该!谢谢您的帮助!

    【讨论】:

    • 我需要这个 json 对象,例如 col name height= {'unit':'cms','value':150}
    • 谢谢!这条评论对我帮助很大! :-)
    【解决方案2】:

    我想重命名 json 数组列的特定键。
    我试过了,它在 PostgreSQL 9.4 上运行:

    UPDATE Your_Table_Name
    SET Your_Column_Name = replace(Your_Column_Name::TEXT,'Key_Old_Name','Key_New_Name')::json
    WHERE attributes::jsonb ? 'Key_Old_Name'
    

    【讨论】:

      【解决方案3】:

      基本上,解决方案是遍历json_array_elements的列表,并基于json值使用CASE条件将某个值替换为另一个值。毕竟,需要使用array_agg()to_json()重新构建新的json数组,psql中聚合函数的描述是here。 可能的查询如下:

      -- Sample DDL and JSON data
      CREATE TABLE jsontest (data JSON);
      INSERT INTO jsontest VALUES ('["a","b","c"]'::JSON);
      -- QUERY
      WITH result AS (
        SELECT to_json( -- creating updated json structure
                   array_agg( -- create array with new element "b1"
                       CASE WHEN element::TEXT = '"b"' -- here we process array elements to find "b"
                         THEN to_json('b1'::TEXT)
                         ELSE element
                       END)) as new_json
        FROM jsontest,json_array_elements(jsontest.data) as element
      )
      UPDATE jsontest SET data = result.new_json FROM result;
      

      【讨论】:

      • 我需要这个 json 对象,例如 col name height= {'unit':'cms','value':150}
      猜你喜欢
      • 1970-01-01
      • 2021-11-22
      • 2020-08-22
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多