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

SQL Server中合并嵌套JSON查询并关联匹配字段的需求

解决方案

假设你的JSON数据结构类似如下(可根据实际结构调整解析路径):

{
  "Models": [
    {
      "x": "Model1",
      "y": "AttrY1",
      "z": "AttrZ1",
      "Energy": {
        "A": ["E_A_001", "E_A_002"],
        "B": ["E_B_001"]
      }
    },
    {
      "x": "Model2",
      "y": "AttrY2",
      "z": "AttrZ2",
      "Energy": {
        "A": ["E_A_003"],
        "B": ["E_B_002", "E_B_003"]
      }
    }
  ]
}

需求一:匹配Energy-A、Energy-B列对应Model的x、y、z字段

通过OPENJSON解析Model层级,再用OUTER APPLY展开Energy下的A、B子数组,实现字段一一对应:

DECLARE @json NVARCHAR(MAX) = '你的JSON内容';

SELECT 
    m.x,
    m.y,
    m.z,
    eA.value AS Energy_A,
    eB.value AS Energy_B
FROM 
    OPENJSON(@json, '$.Models')
    WITH (
        x VARCHAR(50),
        y VARCHAR(50),
        z VARCHAR(50),
        Energy NVARCHAR(MAX) AS JSON -- 将Energy标记为JSON类型以便后续解析
    ) AS m
OUTER APPLY 
    OPENJSON(m.Energy, '$.A') AS eA -- 展开Energy下的A数组
OUTER APPLY 
    OPENJSON(m.Energy, '$.B') AS eB; -- 展开Energy下的B数组

需求二:将Energy子数组合并为分号分隔的单列

使用STRING_AGG函数对展开的数组元素分组拼接,对应Model的x、y、z字段:

DECLARE @json NVARCHAR(MAX) = '你的JSON内容';

SELECT 
    m.x,
    m.y,
    m.z,
    COALESCE(STRING_AGG(eA.value, ';'), '') AS Energy_A_Combined, -- 空数组时返回空字符串
    COALESCE(STRING_AGG(eB.value, ';'), '') AS Energy_B_Combined
FROM 
    OPENJSON(@json, '$.Models')
    WITH (
        x VARCHAR(50),
        y VARCHAR(50),
        z VARCHAR(50),
        Energy NVARCHAR(MAX) AS JSON
    ) AS m
OUTER APPLY 
    OPENJSON(m.Energy, '$.A') AS eA
OUTER APPLY 
    OPENJSON(m.Energy, '$.B') AS eB
GROUP BY 
    m.x, m.y, m.z; -- 按Model的唯一标识分组拼接

整合两种输出到单个查询

通过CTE(公共表表达式)先获取基础展开数据,再用窗口函数实现两种输出的整合:

DECLARE @json NVARCHAR(MAX) = '你的JSON内容';

WITH ModelEnergyCTE AS (
    SELECT 
        m.x,
        m.y,
        m.z,
        eA.value AS Energy_A,
        eB.value AS Energy_B,
        -- 窗口函数在不分组的情况下生成合并后的字符串
        STRING_AGG(eA.value, ';') OVER (PARTITION BY m.x, m.y, m.z) AS Energy_A_Combined,
        STRING_AGG(eB.value, ';') OVER (PARTITION BY m.x, m.y, m.z) AS Energy_B_Combined
    FROM 
        OPENJSON(@json, '$.Models')
        WITH (
            x VARCHAR(50),
            y VARCHAR(50),
            z VARCHAR(50),
            Energy NVARCHAR(MAX) AS JSON
        ) AS m
    OUTER APPLY 
        OPENJSON(m.Energy, '$.A') AS eA
    OUTER APPLY 
        OPENJSON(m.Energy, '$.B') AS eB
)
SELECT DISTINCT -- 去重避免重复行
    x, y, z,
    Energy_A, Energy_B,
    Energy_A_Combined, Energy_B_Combined
FROM ModelEnergyCTE;

注意事项

  • 若你的JSON路径与示例不同,需调整OPENJSON的第二个参数(如$.Models、$.A)以匹配实际结构。
  • STRING_AGG函数仅支持SQL Server 2017及以上版本,若使用更低版本,可通过FOR XML PATH的方式实现字符串拼接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:33:25