首页 > 解决方案 > 如何更新 jsonb 对象的嵌套数组中的值?

问题描述

jsonb我在 PostgreSQL 中得到以下内容:

{
    "segments": [
        {
            "type": "year",
            "settings": [
                {
                    "name": "length",
                    "value": "4"
                }
            ]
        },
        {
            "type": "month",
            "settings": [
                {
                    "name": "length",
                    "value": "2"
                }
            ]
        },
        {
            "type": "dayOfMonth",
            "settings": [
                {
                    "name": "length",
                    "value": "2"
                }
            ]
        },
        {
            "type": "autoIncrement",
            "settings": [
                {
                    "name": "scope",
                    "value": "plant"
                },
                {
                    "name": "period",
                    "value": "day"
                },
                {
                    "name": "length",
                    "value": "10"
                },
                {
                    "name": "paddingCharactor",
                    "value": "0"
                }
            ]
        }
    ]
}

我想在段中将时间段从“天”更新为“永远” -> type=autoIncrement -> settings -> period

我已经尝试jsonb_set在拆分后手动合并数据,但都失败了。

有更新价值的想法吗?

标签: sqljsonpostgresqljsonb

解决方案


根据要求更新给定jsonb值:

WITH cte(j) AS (
   SELECT jsonb '{ ... }'
   )
SELECT jsonb_set(j, '{segments,-1,settings,1,value}'::text[], '"forever"')
FROM   cte;

db<>在这里摆弄

但我不确定你问的问题是否正确。
困难的部分是知道每个嵌套数组中的数组位置。我取了外部数组的最后一个元素 ( -1) 和内部数组的第二个 ( 1)。以下是使用纯 SQL 实现完全动态化的方法:

请考虑采用标准化设计,就像 Kaushik 建议的那样。


推荐阅读