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

4
我有一个像这样的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个回答

4

在阅读文档后,我终于弄明白了,完全可以使用!

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'
)

文档是神奇的东西。首先应该始终查阅文档。 - dfundako
谢谢!在这里找到答案比在文档中容易多了。顺便说一下,您还可以使用扩展语法 CROSS APPLY ( SELECT * FROM OPENJSON(Fields) WITH (FieldName nvarchar(max))) AS Fields ,它允许您为其提供一个表名。 - John Henckel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接