如何将SQL中合并后的JSON数组提取为常规行列格式?
解析JSON数组为关系型表格
没问题,你可以用SQL Server的OPENJSON函数轻松完成这个转换,它专门用来把JSON数据拆解成常规的行和列结构。结合你现有的代码,完整的实现方案如下:
方案一:使用JSON_VALUE提取字段
DECLARE @TheTable table(TheJSON nvarchar(max), Condition int ) DECLARE @mystring nvarchar(100)='{"id": 3, "name": "Three"}' INSERT INTO @TheTable SELECT '[{"id": 1, "name": "One"}, {"id": 2, "name": "Two"}]', 1 UPDATE @TheTable SET TheJSON = JSON_MODIFY(TheJSON, 'append $', JSON_QUERY(N'{"id": 3, "name": "Three"}')) WHERE Condition = 1; -- 核心解析代码 SELECT JSON_VALUE(item.value, '$.id') AS ID, JSON_VALUE(item.value, '$.name') AS Name FROM @TheTable CROSS APPLY OPENJSON(TheJSON) AS item WHERE Condition = 1;
方案二:用OPENJSON的WITH子句直接映射列(更推荐)
这种方式可读性更强,还能直接指定列的数据类型:
DECLARE @TheTable table(TheJSON nvarchar(max), Condition int ) DECLARE @mystring nvarchar(100)='{"id": 3, "name": "Three"}' INSERT INTO @TheTable SELECT '[{"id": 1, "name": "One"}, {"id": 2, "name": "Two"}]', 1 UPDATE @TheTable SET TheJSON = JSON_MODIFY(TheJSON, 'append $', JSON_QUERY(N'{"id": 3, "name": "Three"}')) WHERE Condition = 1; SELECT ID, Name FROM @TheTable CROSS APPLY OPENJSON(TheJSON) WITH ( ID int '$.id', -- 映射JSON中的id字段为int类型的ID列 Name nvarchar(50) '$.name' -- 映射JSON中的name字段为nvarchar类型的Name列 ) WHERE Condition = 1;
执行任意一种方案后,都会得到你想要的结果:
| ID | Name |
|---|---|
| 1 | One |
| 2 | Two |
| 3 | Three |
简单说明原理:
OPENJSON(TheJSON)会把你的JSON数组拆分成单个JSON对象的行数据CROSS APPLY用来将原表的每一行和其对应的JSON拆分结果做关联WITH子句(或JSON_VALUE)用来定义要提取的列名、数据类型,以及对应的JSON字段路径(比如$.id就是取每个JSON对象里的id属性)
这样就能完美把合并后的JSON数组转换成常规表格格式啦!
内容的提问来源于stack exchange,提问作者Red Devil
相关产品推荐
相关产品推荐

