gpt4 book ai didi

json - 如何在数组数组上使用 JSON_MODIFY?

转载 作者:行者123 更新时间:2023-12-04 02:09:00 28 4
gpt4 key购买 nike

我的结构看起来像这样

Declare @layout NVARCHAR(MAX) = N'
{
"Sections": [
{
"SectionName":"Section1",
"SectionOrder":1,
"Renders":[
{
"RenderName":"Render1",
"RenderOrder":1,
"Fields":[
{
"FieldName":"Field1",
"FieldData":"Data1"
},
{
"FieldName":"Field2",
"FieldData":"Data2"
}
]
},
{
"RenderName":"Render2",
"RenderOrder":2,
"Fields":[
{
"FieldName":"Field1",
"FieldData":"Data1"
},
{
"FieldName":"Field2",
"FieldData":"Data2"
}
]
}
]
},
{
"SectionName":"Section2",
"SectionOrder":2,
"Renders":[
{
"RenderName":"Render1",
"RenderOrder":1,
"Fields":[
{
"FieldName":"Field1",
"FieldData":"Data1"
}
]
},
{
"RenderName":"Render2",
"RenderOrder":2,
"Fields":[
{
"FieldName":"Field1",
"FieldData":"Data1"
},
{
"FieldName":"Field2",
"FieldData":"Data2"
}
]
}
]
}
]
}
'

我想做的是这样做:
update FieldData = 'DataUpdated' 
where FieldName = 'Field2'
and RenderName = 'Render'
and SectionName = 'Section1'

我将如何使用 JSON_MODIFY 做到这一点?
I can GET the data using the following query:

SELECT SectionName, SectionOrder, RenderName, RenderOrder, FieldName, FieldData FROM (
SELECT SectionName, SectionOrder, RenderName, RenderOrder, Fields FROM (
select SectionName, SectionOrder, Renders
from OPENJSON(@layout,'$.Sections')
WITH (
SectionName nvarchar(MAX) '$.SectionName',
SectionOrder nvarchar(MAX) '$.SectionOrder',
Renders nvarchar(MAX) '$.Renders' as JSON
)
) as Sections
CROSS APPLY OPENJSON(Renders,'$')
WITH (
RenderName nvarchar(MAX) '$.RenderName',
RenderOrder nvarchar(MAX) '$.RenderOrder',
Fields nvarchar(MAX) '$.Fields' as JSON
)
) as Renders
CROSS APPLY OPENJSON(Fields,'$')
WITH (
FieldName nvarchar(MAX) '$.FieldName',
FieldData nvarchar(MAX) '$.FieldData'
)

最佳答案

这并不像人们希望的那样简单。我很惊讶似乎没有简单的方法来查询 JSON 结构中项目的完整路径。

JSON_MODIFY 只能在定位数组成员时接受数组索引,因此这里的大部分工作都用于为每个嵌套数组成员生成索引。看来[key]列只能在使用 OPENJSON 时生成没有 WITH子句,所以我不能重用你的查询。

此外,JSON_MODIFY将只接受 JSON 路径的字符串文字,因此必须使用动态 SQL 执行更新。

(请注意,此解决方案假定您要更新特定的 RenderName,例如 'Render1' - 在这一点上问题不清楚。)

DECLARE @path nvarchar(2048)

SELECT @path = FORMATMESSAGE('SET @layout = JSON_MODIFY(@layout, ''$.Sections[%s].Renders[%s].Fields[%s].FieldData'', @newValue)' ,sectionindex, renderindex, [key])
FROM
(
SELECT sectionindex, sectionName, b.[key] as renderindex, b.[value] AS bvalue, JSON_VALUE([Value], '$.RenderName') AS renderName
FROM
(SELECT [key] AS sectionindex, [Value] AS avalue, JSON_VALUE([Value], '$.SectionName') AS sectionName
FROM OPENJSON(@layout, '$.Sections') ) AS sections
CROSS APPLY OPENJSON(sections.avalue, '$.Renders') AS b
) AS renders
CROSS APPLY OPENJSON(renders.bvalue,'$.Fields'
) AS d
WHERE JSON_VALUE([Value], '$.FieldName') = 'Field2'
AND RenderName = 'Render1'
AND SectionName = 'Section1'

-- execute the update; this has to happen in dynamic SQL because the JSON_MODIFY path has to be a literal value, and cannot be a variable
EXEC sp_executeSQL @path, N'@layout nvarchar(max) OUTPUT, @newValue nvarchar(max)', @layout = @layout OUTPUT, @newValue = 'DateUpdated'

--check the results
SELECT sectionindex, sectionName, renderindex, rendername, [key] AS fieldindex, JSON_VALUE([Value], '$.FieldName') AS FieldName, JSON_VALUE([Value], '$.FieldData') AS FieldName
FROM
(
SELECT sectionindex, sectionName, b.[key] AS renderindex, b.[value] AS bvalue, JSON_VALUE([Value], '$.RenderName') AS renderName
FROM
(SELECT [key] as sectionindex, [Value] as avalue, JSON_VALUE([Value], '$.SectionName') AS sectionName
FROM OPENJSON(@layout, '$.Sections') ) AS sections
CROSS APPLY OPENJSON(sections.avalue, '$.Renders') AS b
) AS renders
CROSS APPLY OPENJSON(renders.bvalue,'$.Fields'
) AS d

关于json - 如何在数组数组上使用 JSON_MODIFY?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40538714/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com