【问题标题】:PostgresSQL nested jsonb update value of complex key/value pairsPostgresQL 嵌套 jsonb 更新复杂键/值对的值
【发布时间】:2021-01-23 00:11:49
【问题描述】:

从 JSONB 数据类型开始,我希望有人可以帮助我。

我有一个表(properties),其中包含两列(id 作为主键,data 作为 jsonb)。 数据结构是:

    {
        "ProductType": "ABC",
        "ProductName": "XYZ",
        "attributes": [
            {
            "name": "Color",
            "type": "STRING",
            "value": "Silver"
            },
            {
            "name": "Case",
            "type": "STRING",
            "value": "Shells"
            },
            ...
        ]
    }

我想通过 name 更新具有给定 id 行的特定 attributes 元素的 value强>。例如,对于具有 "name"="Case" 的元素,将值更改为 "Glass"。所以它最终像

    {
        "ProductType": "ABC",
        "ProductName": "XYZ",
        "attributes": [
            {
            "name": "Color",
            "type": "STRING",
            "value": "Silver"
            },
            {
            "name": "Case",
            "type": "STRING",
            "value": "Glass"
            },
            ...
        ]
    }

这种结构使用 SQL 是否可行?

如果你们中的任何人想试一试,我已经创建了表格结构。 dbfiddle

【问题讨论】:

标签: postgresql postgresql-10


【解决方案1】:

使用 jsonb 连接运算符 || 即时替换键:

WITH properties (id, data) AS (
  values 
    (1, '{"ProductType": "ABC","ProductName": "XYZ","attributes": [{"name": "Color","type": "STRING","value": "Silver"},{"name": "Case","type": "STRING","value": "Shells"}]}'::jsonb), 
    (2, '{"ProductType": "ABC","ProductName": "XYZ","attributes": [{"name": "Color","type": "STRING","value": "Red"},{"name": "Case","type": "STRING","value": "Shells"}]}'::jsonb)
)
SELECT id,
       data||
       jsonb_build_object(
         'attributes',
         jsonb_agg(
           case 
             when attribs->>'name' = 'Case' then attribs||'{"value": "Glass"}'::jsonb
             else attribs
           end
         )
       ) as data
  FROM properties m
       CROSS JOIN LATERAL JSONB_ARRAY_ELEMENTS(data->'attributes') as a(attribs)
 GROUP BY id, data

Updated fiddle

【讨论】:

  • 我现在意识到我忘了提到如果有多行那么有没有办法通过 id 来定位特定行?抱歉,我会更新问题。
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 2021-09-12
  • 2019-04-24
  • 1970-01-01
  • 2022-01-04
  • 2020-10-22
  • 1970-01-01
  • 2018-01-22
相关资源
最近更新 更多