【问题标题】:Update nested JSON value in SQL Server更新 SQL Server 中的嵌套 JSON 值
【发布时间】:2020-02-12 09:05:31
【问题描述】:

我的表中有以下 Json:

{ 
   "filterCriteria":[ 
      { 
         "fieldId":"abc",
         "filterData":[ 
            { 
               "values":[ 
                  { 
                     "id":1,
                     "value":"1",
                     "text":"1"
                  },
                  { 
                     "id":2,
                     "value":"2",
                     "text":"2"
                  }
               ],
               "filterType":"equals"
            }
         ]
      },
      { 
         "fieldId":"def",
         "filterData":[ 
            { 
               "values":[ 
                  { 
                     "id":3,
                     "value":"3",
                     "text":"3"
                  },
                  { 
                     "id":4,
                     "value":"4",
                     "text":"4"
                  }
               ],
               "filterType":"equals"
            }
         ]
      }
   ]
}

我想根据特定字段 ID 的索引更新值节点。

举个例子:如果我想更新字段id="abc"id=1的值节点,那么我必须写这段代码:

DECLARE @JSON nvarchar(max) = Above mentioned JSON

SELECT
    JSON_MODIFY(@JSON,'$."filterCriteria"[0].filterData[0].values[0].value', 'Hey');

但是,如果我必须根据某些过滤器上的获取索引进行更新,那么我无法弄清楚该怎么做。谁能帮我解决这个问题?

【问题讨论】:

  • fieldId="abc", not id="abc" 我相信是你的意思

标签: json sql-server sql-update sql-server-2017


【解决方案1】:

一种可能的方法是解析输入 JSON,找到索引并修改 JSON。请注意,您需要 SQL Server 2017+ 在 JSON_MODIFY() 调用中提供一个变量作为 path 的值:

JSON:

DECLARE @json nvarchar(max) = N'{"filterCriteria":[{"fieldId":"abc","filterData":[{"values":[{"id":1,"value":"1","text":"1"},{"id":2,"value":"2","text":"2"}],"filterType":"equals"}]},{"fieldId":"def","filterData":[{"values":[{"id":3,"value":"3","text":"3"},{"id":4,"value":"4","text":"4"}],"filterType":"equals"}]}]}'

声明:

SELECT @json = JSON_MODIFY(
   @json,
   CONCAT('$."filterCriteria"[', id1, '].filterData[', id2, '].values[', id3, '].value'),
   'Hey'
)
FROM (
   SELECT j1.[key] AS id1, j3.[key] AS id2, j4.[key] AS id3
   FROM OPENJSON(@json, '$.filterCriteria') j1
   CROSS APPLY OPENJSON(j1.[value], '$') WITH (
      fieldId varchar(3) '$.fieldId',
      filterData nvarchar(max) '$.filterData' AS JSON
   ) j2
   CROSS APPLY OPENJSON(j2.filterData, '$') j3 
   CROSS APPLY OPENJSON (j3.[value], '$.values') j4
   CROSS APPLY OPENJSON (j3.[value], '$.values') WITH (
      id int '$.id'
   ) j5
   WHERE (j2.fieldId = 'abc') AND (j5.id = 1)
) t

SELECT @json

结果(基于您的示例 JSON):

{ 
   "filterCriteria":[ 
      { 
         "fieldId":"abc",
         "filterData":[ 
            { 
               "values":[ 
                  { 
                     "id":1,
                     "value":"Hey",
                     "text":"1"
                  },
                  { 
                     "id":2,
                     "value":"2",
                     "text":"2"
                  }
               ],
               "filterType":"equals"
            }
         ]
      },
      { 
         "fieldId":"def",
         "filterData":[ 
            { 
               "values":[ 
                  { 
                     "id":3,
                     "value":"3",
                     "text":"3"
                  },
                  { 
                     "id":4,
                     "value":"4",
                     "text":"4"
                  }
               ],
               "filterType":"equals"
            }
         ]
      }
   ]
}

【讨论】:

  • 感谢@Zhorov 的回复,但我需要更新表中生成的 json,并且 filterdata 可能有多个值。
猜你喜欢
  • 2022-01-03
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多