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

SQL Server如何按指定RoleName读取JSON列中嵌套数组的字段值

SQL Server JSON字段按属性值查询简化方案

背景说明

SQL Server 内置的JSON路径语法暂不支持[?(@.属性=='值')]这类条件过滤表达式,所以你原有顶层数组结构下,无法直接通过JSON_VALUE指定RoleName一步查询到结果,必须借助OPENJSON做解析。下面提供两种可选方案:

方案1:不调整现有JSON结构,简化OPENJSON写法

对比你原有写法可以去掉多余的嵌套子查询,直接针对业务表查询:

场景1:查询指定RoleName下所有ContactName拼接结果

SELECT STRING_AGG(jc.ContactName, ',') AS ContactName
FROM tblMyTable
CROSS APPLY OPENJSON(JSONColumn) WITH (
    RoleName VARCHAR(50),
    Roles NVARCHAR(MAX) AS JSON
) jr
CROSS APPLY OPENJSON(jr.Roles) WITH (
    ContactName VARCHAR(255)
) jc
WHERE Column1 = 1 AND jr.RoleName = 'Client'

场景2:查询指定RoleName下第一个Roles的ContactName

SELECT TOP 1 jc.ContactName
FROM tblMyTable
CROSS APPLY OPENJSON(JSONColumn) WITH (
    RoleName VARCHAR(50),
    Roles NVARCHAR(MAX) AS JSON
) jr
CROSS APPLY OPENJSON(jr.Roles) WITH (
    ContactName VARCHAR(255)
) jc
WHERE Column1 = 1 AND jr.RoleName = 'Owner'

方案2:调整JSON结构,支持直接路径查询

如果可以修改存储的JSON结构,建议把顶层数组改为以RoleName为key的对象,结构示例:

{
    "Client": {
        "Roles": [
            {
                "ContactID": 21568,
                "ContactName": "FullName1"
            },
            {
                "ContactID": 31568,
                "ContactName": "FullName2"
            }
        ]
    },
    "Owner": {
        "Roles": [
            {
                "ContactID": 1,
                "ContactName": "Billy Buxton"
            }
        ]
    }
}

调整后可以大幅简化查询逻辑:

场景1:查询指定RoleName下第一个Roles的ContactName

直接用JSON_VALUE即可实现:

SELECT JSON_VALUE(JSONColumn, '$.Owner.Roles[0].ContactName') AS ContactName
FROM tblMyTable
WHERE Column1 = 1

场景2:查询指定RoleName下所有ContactName拼接结果

仅需要一层OPENJSON即可:

SELECT STRING_AGG(ContactName, ',') AS ContactName
FROM tblMyTable
CROSS APPLY OPENJSON(JSON_QUERY(JSONColumn, '$.Client.Roles')) WITH (
    ContactName VARCHAR(255)
)
WHERE Column1 = 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:54:04