我需要從包含嵌套 JSON 資料的列的 SQL 表構建自動報告。有一個稱為分發訂單的主鍵,然后是另一個層次結構,其中鍵是每行都會更改的訂單號。此鍵的值是鍵值對陣列。我正在嘗試將此陣列的鍵提取為列及其各自的值。我正在嘗試使用 OPENJSON 和 CROSS APPLY 來實作這一點。我找到了很多關于如何做到這一點的材料,但我面臨的問題是試圖通過改變每一行的第二層密鑰。在執行 CROSS APPLY OPENJSON 兩次之后,現在的關鍵是這個訂單號字串,對于我選擇的每一行資料來說,它都是不同的。我無法硬編碼這個值,因為我有數百行要決議。這是示例 JSON 資料來說明我的問題:
{"distributionOrders":{"3000283984":[{"orderNumber":"3000283984","orderType":"STC","itemNumber":"W01874"}]}}
{"distributionOrders":{"3000308956":[{"orderNumber":"3000308956","orderType":"EVA","itemNumber":"S28741"}]}}
{"distributionOrders":{"3000308961":[{"orderNumber":"3000308961","orderType":"EXP","itemNumber":"W09234"}]}}
{"distributionOrders":{"3000309119":[{"orderNumber":"3000309119","orderType":"STC","itemNumber":"W01874"}]}}
我正在嘗試獲取 orderNumber、orderType 和 itemNumber。在第一個示例中,“3000283984”是我試圖通過的鍵,而不使用當前命名的鍵名。
此查詢適用于一行資料:
SELECT p.orderNumber, p.orderType, p.itemNumber
FROM myDatabase
CROSS APPLY OPENJSON(shipment_details)
WITH (distributionOrders NVARCHAR(max) AS JSON) do
CROSS APPLY OPENJSON(do.distributionOrders)
WITH ("3000325050" NVARCHAR(max) AS JSON)nu
OUTER APPLY OPENJSON(nu."3000325050")
WITH(orderNumber varchar(20), orderType varchar(20), itemNumber varchar(20))p
現在有什么想法可以讓它擴展到數百行嗎?將原始 JSON 修改為通用鍵名是可能的,但這不是我可以控制的。謝謝!
uj5u.com熱心網友回復:
沒有預期的結果,這有點猜測,但也許這就是你所追求的?
CREATE TABLE dbo.YourTable (YourJSON nvarchar(MAX));
GO
INSERT INTO dbo.YourTable(YourJSON)
VALUES
(N'{"distributionOrders":{"3000283984":[{"orderNumber":"3000283984","orderType":"STC","itemNumber":"W01874"}]}}'),
(N'{"distributionOrders":{"3000308956":[{"orderNumber":"3000308956","orderType":"EVA","itemNumber":"S28741"}]}}'),
(N'{"distributionOrders":{"3000308961":[{"orderNumber":"3000308961","orderType":"EXP","itemNumber":"W09234"}]}}'),
(N'{"distributionOrders":{"3000309119":[{"orderNumber":"3000309119","orderType":"STC","itemNumber":"W01874"}]}}');
GO
SELECT dO.orderNumber,
dO.orderType,
dO.itemNumber
FROM dbo.YourTable YT
CROSS APPLY OPENJSON(YT.YourJSON, '$.distributionOrders') J
CROSS APPLY OPENJSON(J.[value])
WITH (orderNumber bigint,
orderType varchar(3),
itemNumber varchar(6)) dO;
GO
DROP TABLE dbo.YourTable;
db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/528459.html
標籤:jsonsql服务器解析
