在SQL Server中将JSON转换为扁平化表格的技术求助
SQL Server JSON 扁平化处理方案
因为看不到你具体的JSON结构和目标表样例,先给你一套通用的OPENJSON实现思路,你可以对照自己的数据调整:
基础场景(单层数组嵌套)
假设你的源表叫JsonStorage,有个存储JSON的列RawJson,JSON结构大概是这样:
{ "OrderId": "ORD001", "CustomerName": "张三", "Products": [ {"ProductId": 1, "ProductName": "手机", "Price": 3999}, {"ProductId": 2, "ProductName": "耳机", "Price": 299} ] }
要扁平化的目标表是把订单信息和每个商品信息拆成一行一行,那可以用下面的SQL:
SELECT -- 提取JSON顶层字段 JSON_VALUE(js.RawJson, '$.OrderId') AS OrderId, JSON_VALUE(js.RawJson, '$.CustomerName') AS CustomerName, -- 提取数组里的字段 oj.ProductId, oj.ProductName, oj.Price FROM JsonStorage js -- 交叉应用OPENJSON解析数组部分 CROSS APPLY OPENJSON(js.RawJson, '$.Products') WITH ( ProductId INT '$.ProductId', ProductName NVARCHAR(100) '$.ProductName', Price DECIMAL(10,2) '$.Price' ) oj
多层嵌套场景
如果JSON里还有更深层次的嵌套数组(比如每个商品下有多个规格),可以嵌套使用CROSS APPLY OPENJSON:
SELECT JSON_VALUE(js.RawJson, '$.OrderId') AS OrderId, oj.ProductId, oj.ProductName, oj2.SpecName, oj2.SpecValue FROM JsonStorage js CROSS APPLY OPENJSON(js.RawJson, '$.Products') WITH ( ProductId INT '$.ProductId', ProductName NVARCHAR(100) '$.ProductName', -- 把嵌套的Specs数组作为JSON字符串传递给下一层OPENJSON Specs NVARCHAR(MAX) '$.Specs' AS JSON ) oj CROSS APPLY OPENJSON(oj.Specs) WITH ( SpecName NVARCHAR(50) '$.Name', SpecValue NVARCHAR(50) '$.Value' ) oj2
根数组场景
如果你的RawJson列本身就是一个数组(比如整个列内容是[{"Id":1},{"Id":2}]),那直接解析根数组即可:
SELECT oj.Id, oj.Name FROM JsonStorage js CROSS APPLY OPENJSON(js.RawJson) WITH ( Id INT '$.Id', Name NVARCHAR(50) '$.Name' ) oj
你只需要把上面示例中的JSON路径、字段类型和名称替换成你实际的结构就行。如果还是有问题,把你的JSON示例和目标表字段列出来,我再帮你调整具体的SQL。
内容的提问来源于stack exchange,提问作者Mac Ank
相关产品推荐
相关产品推荐

