【问题标题】:How to UPDATE "key" in JSONB array in PostgreSQL DB如何在 PostgreSQL 数据库中更新 JSONB 数组中的“键”
【发布时间】:2021-11-22 13:31:09
【问题描述】:

我想更新 PostgreSQL 数据库中的 JSONB 数组,但我得到的大多数解决方案都是用于更新值而不是键。我的目标是将键“SpindSpeed_Med”更改为“SpindleSpeed”,将“RapidOveride_Med”更改为“RapidOverride”。

查询以制作示例数据库:

CREATE TABLE test (
    uid int,
    tooldata jsonb
);

INSERT INTO test (uid, tooldata) 
VALUES (1, '[
  {
    "Ftn": 1,
    "SpindSpeed_Med": 1234,
    "RapidOveride_Med": 100
  },
  {
    "Ftn": 2,
    "SpindSpeed_Med": 1234,
    "RapidOveride_Med": 100
  },
  {
    "Ftn": 3,
    "SpindSpeed_Med": 1234,
    "RapidOveride_Med": 100
  }]'),
(2, '[
  {
    "Ftn": 1,
    "SpindSpeed_Med": 1234,
    "RapidOveride_Med": 100
  },
  {
    "Ftn": 2,
    "SpindSpeed_Med": 1234,
    "RapidOveride_Med": 100
  },
  {
    "Ftn": 3,
    "SpindSpeed_Med": 1234,
    "RapidOveride_Med": 100
  }
]');

^更新了多行并添加了uid

预期结果:

[{"Ftn": 1, "SpindleSpeed": 1234, "RapidOverride": 100}, 
{"Ftn": 2, "SpindleSpeed": 1234, "RapidOverride": 100},
{"Ftn": 3, "SpindleSpeed": 1234, "RapidOverride": 100}] 

我尝试过使用“jsonb_set”,但这只会改变值部分而不是键。此外,我使用了“jsonb_object_keys”和“jsonb_array_elements”的组合,但结果只给出了键,我无法将它放回数组中。提前致谢!

【问题讨论】:

    标签: sql arrays postgresql jsonb


    【解决方案1】:
    select jsonb_agg (q2) from (
      select json_agg(
        j::jsonb - 'SpindSpeed_Med' ||
        jsonb_build_object('SpindleSpeed', j->'SpindSpeed_Med')
      )
    from (
        select jsonb_array_elements(tooldata) as j from jsontest
    ) as q) as q2 ;
    

    首先,将 jsonb 数组拆分为行,删除“SpindSpeed_Med”,为每行添加“SpindleSpeed”,最后组合回 jsonb。

    【讨论】:

    • 谢谢!但结果我得到它把所有东西都放在一行中。我应该如何以与以前相同的格式获得它。我现在已经更新了多行数据的 SQL 查询。
    • 您的表中没有任何类型的主键吗?将其添加到查询中并 GROUP BY
    • 这里是完整的解决方案: WITH temptable AS ( SELECT "uid", jsonb_agg(elements::jsonb - 'SpindSpeed_Med' || jsonb_build_object('SpindleSpeed_Med', elements->'SpindSpeed_Med')) AS "tooldata" FROM (SELECT "uid", jsonb_array_elements(test."tooldata") AS elements FROM "test" AS test) AS aliasname GROUP BY "uid" ) UPDATE "test" AS te SET "tooldata" = temptable."tooldata " FROM temptable WHERE te."uid" = temptable."uid"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多