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
相关产品推荐
相关产品推荐

