pto*_*bro 5 sql sql-server arrays json open-json
我正在尝试为嵌套数组设置 OPENJSON 函数的路径,但它不起作用。尝试了我在网上找到的不同变体和示例/资源,但仍然无法弄清楚。
有任何想法吗?
编辑:
需要明确的是,我知道如何使用 CROSSAPPLY 和其他方法来做到这一点。我的问题是如何在可能的情况下使用 OPENJSON 函数的路径参数来具体执行此操作。
这是我的代码:
DECLARE @json NVARCHAR(MAX);
SET @json = '
{
"orders": [
{
"id":"1",
"date":"7/4/2020",
"orderlines": [
{"id": "1", "amount": 100},
{"id": "2", "amount": 200}
]
},
{
"id":"2",
"date":"7/4/2020",
"orderlines": [
{"id": "3", "amount": 300},
{"id": "4", "amount": 400}
]
}
]
}
'
-- None of these return results. How do I specify the path to the "orderlines" array?
SELECT * FROM OPENJSON(@json,'$.orderlines');
SELECT * FROM OPENJSON(@json,'$.orderlines[1]');
SELECT * FROM OPENJSON(@json,'$.orders.orderlines');
SELECT * FROM OPENJSON(@json,'$.orders.orderlines[1]');
-- This works:
SELECT * FROM OPENJSON(@json,'$.orders');
Run Code Online (Sandbox Code Playgroud)
您可以使用WITH并为内部值命名,然后使用CROSS APPLY在另一个OPENJSON中使用它们。现在您可以将所有内部对象放在一起。
SELECT orderlines.id, orderlines.amount
FROM OPENJSON(@json, '$.orders') WITH (orderlines NVARCHAR(MAX) '$.orderlines' AS JSON) orders
CROSS APPLY OPENJSON(orders.orderlines) WITH (id INT '$.id', amount INT '$.amount') orderlines
Run Code Online (Sandbox Code Playgroud)
在这里了解更多信息。
另外,如果需要获取数组中的特定项目:
SELECT * FROM OPENJSON(@json, '$.orders[0].orderlines[0]')
-- OR
SELECT JSON_VALUE(@json, '$.orders[0].orderlines[0].amount')
Run Code Online (Sandbox Code Playgroud)