如何在子 OPENJSON 的结果上使用 OPENJSON

Posted

技术标签:

【中文标题】如何在子 OPENJSON 的结果上使用 OPENJSON【英文标题】:How do I use OPENJSON on the result of a sub OPENJSON 【发布时间】:2016-11-07 20:55:47 【问题描述】:

我有一个这样的 JSON 结构:

Declare @layout NVARCHAR(MAX) = N'
    
        "Sections": [
            
                "SectionName":"Section1",
                "SectionOrder":1,
                "Fields":[
                    
                        "FieldName":"Field1",
                        "FieldData":"Data1"
                    ,
                    
                        "FieldName":"Field2",
                        "FieldData":"Data2"
                    
                ]
            ,
            
                "SectionName":"Section2",
                "SectionOrder":2,
                "Fields":[
                    
                        "FieldName":"Field3",
                        "FieldData":"Data3"
                    ,
                    
                        "FieldName":"Field4",
                        "FieldData":"Data4"
                    
                ]
            
        ]
    
'

如何查询 Sections.Fields.FieldName = 'Field3' 的等效项?

select *
from OPENJSON(@layout,'$.Sections') 
WITH (
    SectionName nvarchar(MAX) '$.SectionName',  
    SectionOrder nvarchar(MAX) '$.SectionOrder', 
    Fields nvarchar(MAX) '$.Fields' as JSON
)

这是目前为止,我不能再继续下去,否则它不会返回任何结果。

【问题讨论】:

【参考方案1】:

在阅读文档后想通了,完全有效!

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

【讨论】:

文档是个神奇的东西。应始终先咨询。 谢谢!在这里找到答案比在文档中要容易得多。顺便说一句,你也可以使用扩展语法CROSS APPLY ( SELECT * FROM OPENJSON(Fields) WITH (FieldName nvarchar(max))) AS Fields,它允许你给它一个表名。

以上是关于如何在子 OPENJSON 的结果上使用 OPENJSON的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sql Server 2016 的 OPENJSON 函数从 Json 文档中的多个数组元素中选择结果

使用 TSQL OPENJSON 如何从具有动态键名的 JSON 数组中提取值

SQL Server OPENJSON 读取嵌套的 json

window.open()打开一个子页面,如何在子页面关闭时刷新父页面?

window.open()打开一个子页面,如何在子页面关闭时刷新父页面?

如何使用 OpenJson 将 JSON 列标题转换为小写