查询JSON数据返回NULL值:如何正确提取嵌套JSON字段?
问题原因
你的错误在于**images是JSON数组类型**,而非单个JSON对象。直接使用$.images.key这类路径无法正确定位数组内的元素——这种路径语法仅适用于单个对象的属性,因此会返回NULL。
解决方案
根据需求不同,有两种常用处理方式:
方案1:展开所有图片记录(每个图片对应一行)
通过CROSS APPLY配合OPENJSON解析嵌套的images数组,可提取每个图片的key和imageNumber,同时关联对应的仪器编号:
select main.instrumentNumber, img.skey, img.imageNumber from openjson (@json) with( instrumentNumber nvarchar(100) '$.instrumentNumber', images nvarchar(max) '$.images' as json -- 将images标记为JSON类型,用于后续解析 ) as main cross apply openjson(main.images) with( skey nvarchar(500) '$.key', imageNumber int '$.imageNumber' ) as img
执行后结果示例:
| instrumentNumber | skey | imageNumber |
|---|---|---|
| 94109416 | c:\stapler\booktest\gray00024.jp2 | 1 |
| 94109417 | c:\stapler\booktest\gray00025.jp2 | 1 |
| 94109417 | c:\stapler\booktest\gray00026.jp2 | 2 |
| 94109418 | c:\stapler\booktest\gray00027.jp2 | 1 |
| 94109418 | c:\stapler\booktest\gray00028.jp2 | 2 |
方案2:保留仪器行,合并图片信息(可选)
若希望每个仪器编号对应一行,同时合并该仪器的所有图片信息,可使用STRING_AGG函数:
select instrumentNumber, STRING_AGG(img.skey, ', ') as imageKeys, STRING_AGG(cast(img.imageNumber as nvarchar), ', ') as imageNumbers from openjson (@json) with( instrumentNumber nvarchar(100) '$.instrumentNumber', images nvarchar(max) '$.images' as json ) as main cross apply openjson(main.images) with( skey nvarchar(500) '$.key', imageNumber int '$.imageNumber' ) as img group by instrumentNumber
执行后结果示例:
| instrumentNumber | imageKeys | imageNumbers |
|---|---|---|
| 94109416 | c:\stapler\booktest\gray00024.jp2 | 1 |
| 94109417 | c:\stapler\booktest\gray00025.jp2, c:\stapler\booktest\gray00026.jp2 | 1, 2 |
| 94109418 | c:\stapler\booktest\gray00027.jp2, c:\stapler\booktest\gray00028.jp2 | 1, 2 |
内容的提问来源于stack exchange,提问作者user1083828
相关产品推荐
相关产品推荐

