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

SQL Server中如何将JSON数组字段拆分为多行关联数据?

解决SQL Server解析JSON数组为行的问题

别担心,这事儿用SQL Server 2016自带的JSON函数就能轻松搞定,我给你拆解下思路和具体代码:

核心思路

SQL Server 2016引入的OPENJSON()函数专门用来处理JSON数据,它能把JSON数组转换成关系型的行集,正好匹配你要把每个JSON对象拆成一行的需求。我们只需要把原表和OPENJSON()解析后的结果做关联,就能得到你想要的扁平结构。

具体实现代码

假设你的表名叫CustomerData,直接用下面的查询就能得到目标结果:

SELECT 
    t.CustomerID,
    j.ID,
    j.Height,
    j.Weight,
    j.Colour
FROM 
    CustomerData t
CROSS APPLY 
    OPENJSON(t.JsonCol)
    WITH (
        ID INT '$.Id',          -- 提取JSON里的Id字段,转成INT类型
        Height INT '$.Height',  -- 提取Height字段,转成INT
        Weight INT '$.Weight',  -- 提取Weight字段,转成INT
        Colour NVARCHAR(50) '$.Colour'  -- 提取Colour字段,用字符串类型
    ) j;

代码解释

  • CROSS APPLY:这个关键字的作用是把原表的每一行,和该行JsonCol字段解析出的所有JSON对象做关联。比如CustomerID=55的行,JSON数组里有2个对象,就会生成2条关联后的行,每条行都带着55这个CustomerID。
  • OPENJSON(t.JsonCol):指定要解析的JSON列,它会把数组里的每个对象转换成一行“原始”的键值对,然后我们用WITH子句来定义最终要输出的列。
  • WITH子句:这里的每个条目都对应你要提取的字段:左边是输出列的名称和数据类型,右边的$.属性名是JSON路径,用来定位要提取的属性值。比如$.Id就是取当前JSON对象里的Id属性。

额外注意事项

  • 确保JsonCol里的内容是有效的JSON格式,如果有无效的JSON,OPENJSON会返回空或者报错。你可以用ISJSON()函数排查:
    SELECT * FROM CustomerData WHERE ISJSON(JsonCol) = 0;
    
  • 如果有些行的JsonCol是空数组或者NULL,CROSS APPLY会把这些行过滤掉。如果想保留这些行(即使没有JSON数据),把CROSS APPLY换成OUTER APPLY就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:33:11