我之前在 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,然后是組。有誰知道如何決議組陣列中的多個物件?那是我沒有的部分。
我的目標是制作一份報告,其中每個訂單都在一行上。
| 命令 | 組物件 1 名稱 | 組物件 2 名稱 |
|---|---|---|
| 4568 | 清單 1 | 清單 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
不過,我還沒有將組欄位中的資訊決議到他們自己的列中。
uj5u.com熱心網友回復:
假設我正確修復了序列化問題,可能是這樣的
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/414978.html
標籤:
