You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询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

执行后结果示例:

instrumentNumberskeyimageNumber
94109416c:\stapler\booktest\gray00024.jp21
94109417c:\stapler\booktest\gray00025.jp21
94109417c:\stapler\booktest\gray00026.jp22
94109418c:\stapler\booktest\gray00027.jp21
94109418c:\stapler\booktest\gray00028.jp22

方案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

执行后结果示例:

instrumentNumberimageKeysimageNumbers
94109416c:\stapler\booktest\gray00024.jp21
94109417c:\stapler\booktest\gray00025.jp2, c:\stapler\booktest\gray00026.jp21, 2
94109418c:\stapler\booktest\gray00027.jp2, c:\stapler\booktest\gray00028.jp21, 2

内容的提问来源于stack exchange,提问作者user1083828

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:35:19