通过 OPENJSON 检索 JSON 嵌套值

Posted

技术标签:

【中文标题】通过 OPENJSON 检索 JSON 嵌套值【英文标题】:Retrieve JSON Nested Values Via OPENJSON 【发布时间】:2019-07-02 20:14:06 【问题描述】:

需要检索 Batters/Batter/Type 1-4 的值

这是 JSON 数据

[

        "id": "0001",
        "type": "donut",
        "name": "Cake",
        "ppu": 0.55,
        "batters":
            
                "batter":
                    [
                         "id": "1001", "type": "Regular" ,
                         "id": "1002", "type": "Chocolate" ,
                         "id": "1003", "type": "Blueberry" ,
                         "id": "1004", "type": "Devil's Food" 
                    ]
            ,
        "topping":
            [
                 "id": "5001", "type": "None" ,
                 "id": "5002", "type": "Glazed" ,
                 "id": "5005", "type": "Sugar" ,
                 "id": "5007", "type": "Powdered Sugar" ,
                 "id": "5006", "type": "Chocolate with Sprinkles" ,
                 "id": "5003", "type": "Chocolate" ,
                 "id": "5004", "type": "Maple" 
            ]
    
]

使用 selected * from openjson 检索值,但无法获取嵌套/嵌套值

Select * from openjson(@json_known, '$[1]')
with
(
KeyID int '$.id',
[Type] varchar(max) '$.type',
[Name] varchar(max) '$.name',
PPU varchar(max) '$.ppu',
Batter0 varchar(max) '$.batters.batter.type[0]',
Batter1 varchar(max) '$.batters.batter.id[1]',
Batter2 varchar(max) '$.batters.batter.type[2]',
Batter3 varchar(max) '$.batters.batter.type[3]'
)

【问题讨论】:

【参考方案1】:

你可以使用:

Select x.Batter
from openjson(@json_known, '$') s
cross apply openjson(json_query(s.value, '$.batters.batter'))
with (id INT '$.id',Batter varchar(max) '$.type') x;

db<>fidlde demo

【讨论】:

谢谢。这确实提供了我需要的信息,但不是我需要的格式。我的最终结果是每个击球手都有一个列,其中包含它的值。例如Batter1 = 普通,Batter2 = 巧克力,Batter3 = 蓝莓,Batter4 = 恶魔的食物 @GrimRieber 如果您想要正确的格式,只需为建议的 JSON 发布整个结果表。如果您花一秒钟,您可以轻松地自己 PIVOT 数据

以上是关于通过 OPENJSON 检索 JSON 嵌套值的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中的OpenJson用于嵌套的json数据?

OPENJSON - 无法查询嵌套元素

具有深度嵌套数组循环的 SQL 查询 OpenJson

OpenJson 使用通配符

如何通过 PYTHON 为 SQL INSERT FROM OPENJSON 转义 JSON 响应中的字符

Openjson 在定义 nvarchar(max) 时不返回 json 对象,并且由 nvarchar(4000) 工作