1

我正在尝试为嵌套数组的 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');
4

3 回答 3

1

您可以使用 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

1

在这里了解更多。

另外,如果需要获取数组中的特定项目:

SELECT * FROM OPENJSON(@json, '$.orders[0].orderlines[0]')
-- OR
SELECT JSON_VALUE(@json, '$.orders[0].orderlines[0].amount')
于 2020-07-04T08:41:22.217 回答
0

您可以尝试以下方法:

SELECT *
FROM OPENJSON (@json, '$.orders')
WITH (
    id INT '$.id',
    [date] VARCHAR(10) '$.date',
 
    orderlines_id1 INT '$.orderlines[0].id',
    orderlines_amount1 MONEY '$.orderlines[0].amount', 
 
    orderlines_id2 INT '$.orderlines[1].id',
    orderlines_amount2 MONEY '$.orderlines[1].amount'
) AS Orders

请在此处查看 db<>fiddle 。

于 2020-07-04T01:31:02.313 回答
0

为了让可能正在查看此内容的其他人清楚,Iman Kazemi 的回答部分是他所写的以下内容:

SELECT * FROM OPENJSON(@json, '$.orders[0].orderlines[0]')

我忽略了在订单数组上指定索引。

再次感谢伊曼。

于 2020-07-04T16:58:19.597 回答