【问题标题】:How to update array inside postgresql jsonb field?如何更新 postgresql jsonb 字段中的数组?
【发布时间】:2020-02-27 13:29:45
【问题描述】:

我有一个带有jsonb字段的表,值的一个例子:

{
    "id": "test",
    "data": [
        {
            "folder1": ["id1", "id2", "id3"]
        }
    ]
}

我想将数组 ["id1", "id2", "id3"] 里面的数据替换为 [{"id": "id1", "size": 10}, {"id": "id2 ", "size": 100}, {"id": "id3", "size": 1000}]:

{
    "id": "test",
    "data": [
        {
            "folder1": [
                {"id": "id1", "size": 10}, 
                {"id": "id2", "size": 100}, 
                {"id": "id3", "size": 1000}
            ]
        }
    ]
}

如果可以在单个 sql 构造中更新它,我需要使用 pl/sql 来更新它吗?

【问题讨论】:

  • 10、100 和 1000 是从哪里来的?
  • 拥有一个对象数组,其中每个对象都有一个唯一标识符,这是一种反模式。如果每个对象都有标识,则使用该标识作为更高级别对象的键,而不是使用更高级别的数组。

标签: sql json postgresql jsonb


【解决方案1】:

如果要替换的元素的路径是固定的,可以使用jsonb_set()

jsonb_set(
        mycol,
        '{data,0,folder1}',
         '[{"id": "id1", "size": 10}, {"id": "id2", "size": 100}, {"id": "id3", "size": 1000}]'::jsonb
    )

Demo on DB Fiddle - 使用jsonb_pretty() 进行格式化。

【讨论】:

  • 问题是路径不固定(
  • @mystdeim:您可能应该在您的问题中说明这一点,并提供证明这一点的示例数据(不止一个值)。
猜你喜欢
  • 2021-02-12
  • 2015-07-16
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多