首页 > 解决方案 > postgres jsonb更新数组中的键值

问题描述

我有一个表,其中有一jsonb列数据来自一行,例如

[
    {
        "a": [], 
        "c_id": 624, 
        "ps": [{"": 0, "pr": "73", "f": "M", "s": "M"}], 
        "g_n": "K L Mish", 
        "g_num": 1
    },
   {
        "a": [], 
        "c_id": 719, 
        "ps": [{"": 0, "pr": "65433", "f": "R", "s": "W"}], 
        "g_n": "S H Star", 
        "g_num": 2
    }, 
]

我想c_id在表格中从 719 更新到 720。我该怎么做?

我正在使用 Postgres 12.1

标签: sqljsonpostgresql

解决方案


如果它只出现一次,您可以使用正则表达式:

点击:demo:db<>fiddle

UPDATE mytable
SET mydata = s.result::jsonb
FROM (
    SELECT
        regexp_replace(mydata::text, '(.*)("c_id"\s*:\s*)(719)(.*)','\1\2720\4') AS result
    FROM
        mytable
) s;

正则表达式组:

  1. (.*)相关键之前的所有字符
  2. ("c_id"\s*:\s*)相关密钥包括。可能的空间
  3. (719)要替换的相关值
  4. (.*)相关点之后的所有内容

\1\2720\4前两组放在一起,然后是新值(而不是第 3 组)和第四组。


免责声明

我完全同意@a_horse_with_no_name:您应该考虑将所有值存储在单独的规范化表/列中。您将获得很多好处(更好的搜索和更新处理、索引、性能……)。如果你需要这个 JSON 输出,把它当作输出处理即可:需要时生成,不要存储。也许一个视图可以帮助很多


推荐阅读