postgres jsonb更新数组中的键值

时间:2019-11-25 11:34:09

标签: sql json postgresql

我有一个带有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

1 个答案:

答案 0 :(得分:1)

如果只有一次,可以使用正则表达式来实现:

Click: 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;

RegExp组:

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

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


免责声明

我完全同意@a_horse_with_no_name:您应该考虑将所有值存储在单独的标准化表/列中。您将获得很多好处(更好的搜索和更新处理,索引编制,性能等等)。如果需要此JSON输出,则将其作为输出处理:在需要时生成它,而不存储它。也许一个视图会很有帮助