如何用 TSQL 解析 JSON
How to parse JSON with TSQL
我之前在 TSQL 中做过一些基本的 JSON 解析,但我 运行 进行了一些更复杂的解析。
我试图解析的 JSON 对象中的实际字段是一个包含两个对象的数组。
例如:
{
"Channel":[],
"Account":[],
"OrderId": 4568,
"ParentAccount"null,
"Groups":[
{"Name":"List 1", "Include": false, "SalesDetails"[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2021", "End:"12/31/2021"},
"State":"NC"}]
},
{"Name":"List 2", "Include": true, "SalesDetails"[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2022", "End:"01/10/2022"},
"State":"SC"}]
}
],
"IsCustomer":true,
"ReferenceNumber": 554673
}
我想在 SQL 中做的是解析帐户、订单 ID,然后是组。有谁知道如何解析组数组中的多个对象?那是我没有的部分。
我的目标是生成一份报告,其中每个订单都在一行中。
order
groups object 1 name
groups object 2 name
4568
list 1
list 2
我正在尝试获取名称之间的其他值,例如 Include 并让 SalesDetail 成为它们自己的列。
到目前为止,以下内容让我最接近我所追求的:
SELECT
JSON_QUERY(data, '$.account') AS 'Account',
JSON_QUERY(data, '$.orderid') AS 'Order',
JSON_QUERY(data, '$.groups') AS 'Group_Detail'
FROM table
不过,我还没有将组字段中的信息解析到它们自己的单独列中。
假设我正确地修复了序列化问题,可能是这样的
declare @json nvarchar(max)=N'{
"Channel":[],
"Account":[],
"OrderId": 4568,
"ParentAccount":null,
"Groups":[
{"Name":"List 1", "Include": false, "SalesDetails":[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2021", "End":"12/31/2021"},
"State":"NC"}]
},
{"Name":"List 2", "Include": true, "SalesDetails":[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2022", "End":"01/10/2022"},
"State":"SC"}]
}
],
"IsCustomer":true,
"ReferenceNumber": 554673
}';
select OrderId,
grp1.[Name] [groups object 1 name],
grp2.[Name] [groups object 2 name]
from openjson(@json) with (OrderId int,
Groups nvarchar(max) as json) oj
cross apply openjson(oj.Groups, '$[0]') with ([Name] nvarchar(4000)) grp1
cross apply openjson(oj.Groups, '$[1]') with ([Name] nvarchar(4000)) grp2;
OrderId groups object 1 name groups object 2 name
4568 List 1 List 2
我之前在 TSQL 中做过一些基本的 JSON 解析,但我 运行 进行了一些更复杂的解析。
我试图解析的 JSON 对象中的实际字段是一个包含两个对象的数组。
例如:
{
"Channel":[],
"Account":[],
"OrderId": 4568,
"ParentAccount"null,
"Groups":[
{"Name":"List 1", "Include": false, "SalesDetails"[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2021", "End:"12/31/2021"},
"State":"NC"}]
},
{"Name":"List 2", "Include": true, "SalesDetails"[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2022", "End:"01/10/2022"},
"State":"SC"}]
}
],
"IsCustomer":true,
"ReferenceNumber": 554673
}
我想在 SQL 中做的是解析帐户、订单 ID,然后是组。有谁知道如何解析组数组中的多个对象?那是我没有的部分。
我的目标是生成一份报告,其中每个订单都在一行中。
order | groups object 1 name | groups object 2 name |
---|---|---|
4568 | list 1 | list 2 |
我正在尝试获取名称之间的其他值,例如 Include 并让 SalesDetail 成为它们自己的列。
到目前为止,以下内容让我最接近我所追求的:
SELECT
JSON_QUERY(data, '$.account') AS 'Account',
JSON_QUERY(data, '$.orderid') AS 'Order',
JSON_QUERY(data, '$.groups') AS 'Group_Detail'
FROM table
不过,我还没有将组字段中的信息解析到它们自己的单独列中。
假设我正确地修复了序列化问题,可能是这样的
declare @json nvarchar(max)=N'{
"Channel":[],
"Account":[],
"OrderId": 4568,
"ParentAccount":null,
"Groups":[
{"Name":"List 1", "Include": false, "SalesDetails":[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2021", "End":"12/31/2021"},
"State":"NC"}]
},
{"Name":"List 2", "Include": true, "SalesDetails":[{
"Manufacturer":[], "DateRange":{"Start":"01/01/2022", "End":"01/10/2022"},
"State":"SC"}]
}
],
"IsCustomer":true,
"ReferenceNumber": 554673
}';
select OrderId,
grp1.[Name] [groups object 1 name],
grp2.[Name] [groups object 2 name]
from openjson(@json) with (OrderId int,
Groups nvarchar(max) as json) oj
cross apply openjson(oj.Groups, '$[0]') with ([Name] nvarchar(4000)) grp1
cross apply openjson(oj.Groups, '$[1]') with ([Name] nvarchar(4000)) grp2;
OrderId groups object 1 name groups object 2 name
4568 List 1 List 2