如何使用 SQL 服务器解析列表的 JSON 列表
How to parse JSON list of list using SQL Server
从 API 服务器数据库中解析 SQL 服务器数据库中的数据,returns 数据格式如下:
declare @json nvarchar(4000) = N'{
"List":{
"header":{
"id":"id1",
"resolution":"Hourly"
},
"values":[
[
{
"dateTime":"2020-10-01T00:00:00",
"unit":"MWh",
"val":0.9
},
{
"dateTime":"2020-10-01T01:00:00",
"unit":"MWh",
"val":1.1
}
],
[
{
"dateTime":"2020-10-02T00:00:00",
"unit":"MWh",
"val":0.5
},
{
"dateTime":"2020-10-02T01:00:00",
"unit":"MWh",
"val":0.3
}
]
]
}
}'
问题在于键值里面是json中的列表列表。我想要以下格式的数据:
id
dateTime
unit
val
id1
2020-10-01T00:00:00
MWh
0.9
id1
2020-10-01T01:00:00
MWh
1.1
id1
2020-10-02T00:00:00
MWh
0.5
id1
2020-10-02T01:00:00
MWh
0.3
我用这段代码测试过:
SELECT
(SELECT *
FROM OPENJSON (@json, '$.List.header')
WITH (entityid varchar(200) '$.id')) id,
*
FROM
OPENJSON (@json, '$.List.values')
WITH (datetime datetime '$.dateTime',
unit varchar(10) '$.unit',
val float '$.val')
但我明白了
id
dateTime
unit
val
id1
null
null
null
id1
null
null
null
id1
null
null
null
id1
null
null
null
这是因为在values
中你有数组中的数组。一种方法如下:
SELECT CONVERT(varchar(50),JSON_VALUE(l.header,'$.id')) AS id, vv.*
FROM OPENJSON(@json,'$.List')
WITH (header nvarchar(MAX) AS JSON,
[values] nvarchar(MAX) AS JSON) l
CROSS APPLY OPENJSON(l.[values]) v
CROSS APPLY OPENJSON(v.value)
WITH ([dateTime] datetime2(0),
unit varchar(20),
val decimal(5,1)) vv;
从 API 服务器数据库中解析 SQL 服务器数据库中的数据,returns 数据格式如下:
declare @json nvarchar(4000) = N'{
"List":{
"header":{
"id":"id1",
"resolution":"Hourly"
},
"values":[
[
{
"dateTime":"2020-10-01T00:00:00",
"unit":"MWh",
"val":0.9
},
{
"dateTime":"2020-10-01T01:00:00",
"unit":"MWh",
"val":1.1
}
],
[
{
"dateTime":"2020-10-02T00:00:00",
"unit":"MWh",
"val":0.5
},
{
"dateTime":"2020-10-02T01:00:00",
"unit":"MWh",
"val":0.3
}
]
]
}
}'
问题在于键值里面是json中的列表列表。我想要以下格式的数据:
id | dateTime | unit | val |
---|---|---|---|
id1 | 2020-10-01T00:00:00 | MWh | 0.9 |
id1 | 2020-10-01T01:00:00 | MWh | 1.1 |
id1 | 2020-10-02T00:00:00 | MWh | 0.5 |
id1 | 2020-10-02T01:00:00 | MWh | 0.3 |
我用这段代码测试过:
SELECT
(SELECT *
FROM OPENJSON (@json, '$.List.header')
WITH (entityid varchar(200) '$.id')) id,
*
FROM
OPENJSON (@json, '$.List.values')
WITH (datetime datetime '$.dateTime',
unit varchar(10) '$.unit',
val float '$.val')
但我明白了
id | dateTime | unit | val |
---|---|---|---|
id1 | null | null | null |
id1 | null | null | null |
id1 | null | null | null |
id1 | null | null | null |
这是因为在values
中你有数组中的数组。一种方法如下:
SELECT CONVERT(varchar(50),JSON_VALUE(l.header,'$.id')) AS id, vv.*
FROM OPENJSON(@json,'$.List')
WITH (header nvarchar(MAX) AS JSON,
[values] nvarchar(MAX) AS JSON) l
CROSS APPLY OPENJSON(l.[values]) v
CROSS APPLY OPENJSON(v.value)
WITH ([dateTime] datetime2(0),
unit varchar(20),
val decimal(5,1)) vv;