sql - 将 Json 嵌套对象数组转换为表行
问题描述
我有一个像这样的json:
[
{
"Id": "1234",
"stockDetail": [
{
"Number": "10022_1",
"Code": "500"
},
{
"Number": "10022_1",
"Code": "600"
}
]
},
{
"Id": "1235",
"stockDetail": [
{
"Number": "10023_1",
"Code": "100"
},
{
"Number": "10023_1",
"Code": "100"
}
]
}
]
如何在下面的sql表中转换它:
+------+---------+------+
| Id | Number | Code |
+------+---------+------+
| 1234 | 10022_1 | 500 |
| 1234 | 10022_1 | 600 |
| 1235 | 10023_1 | 100 |
| 1235 | 10023_1 | 100 |
+------+---------+------+
解决方案
在您的情况下,您可以尝试将 JSON 子节点与父节点交叉应用:
DECLARE @json nvarchar(max)
SET @json = N'
[
{
"Id": "1234",
"stockDetail": [
{
"Number": "10022_1",
"Code": "500"
},
{
"Number": "10022_1",
"Code": "600"
}
]
},
{
"Id": "1235",
"stockDetail": [
{
"Number": "10023_1",
"Code": "100"
},
{
"Number": "10023_1",
"Code": "100"
}
]
}
]'
SELECT
JSON_Value (i.value, '$.Id') as ID,
JSON_Value (d.value, '$.Number') as [Number],
JSON_Value (d.value, '$.Code') as [Code]
FROM OPENJSON (@json, '$') as i
CROSS APPLY OPENJSON (i.value, '$.stockDetail') as d
输出:
ID Number Code
1234 10022_1 500
1234 10022_1 600
1235 10023_1 100
1235 10023_1 100
推荐阅读
- python - 构造主要方法
- mysql - SQLselect查询相同用户ID的同一列中的不同值
- angular - 在 Angular2 中使用静态 html 页面
- c# - C# XML 序列化/反序列化数组字符串到数组元素名称
- php - Laravel 5.6 检查和存储多维文件数组问题
- c - FFTW 相关中的交替误差
- c# - 重新启动服务(具有自定义数据库架构名称)时,如何防止 EF6 回退到“dbo”架构?
- python - 在 Python 上运行模块(在本例中为 Scrapy)
- firebase-realtime-database - 让用户在 firebase 中访问自己的数据
- java - Java:ClassCastException - java.lang.Class 不能转换为