JSON_QUERY 做一个 "Select Many"

JSON_QUERY to do a "Select Many"

我有一个 JSON 变量,看起来像这样(真实的更复杂):

DECLARE @myJson VARCHAR(3000) = '{
    "CustomerId": "123456",
    "Orders": [{
            "OrderId": "852",
            "OrderManifests": [{
                    "ShippedProductId": 884,
                    "ProductId": 884
                }, {
                    "ShippedProductId": 951,
                    "ProductId": 2564
                }    
            ]
        }, {
            "OrderId": "5681",
            "OrderManifests": [{
                    "ShippedProductId": 198,
                    "ProductId": 4681
                }, {
                    "ShippedProductId": 8188,
                    "ProductId": 8188
                }, {
                    "ShippedProductId": 144,
                    "ProductId": 8487
                }
            ]
        }
    ]
}'

最后,我需要知道是否有任何 ShippedProductId 值匹配它们对应的 ProductId(在同一个 JSON 对象).

我首先尝试获取所有 OrderManifests 的列表。但是虽然这会让我得到订单数组:

SELECT JSON_QUERY(@myJson, '$.Orders')

我似乎无法找到一种方法来获取 OrderManifests 数组中所有条目的所有 OrderManifests 列表.这不起作用:

SELECT JSON_QUERY(@myJson, '$.Orders.OrderManifests')

有没有办法进行 Select 多种查询以获取 Orders 数组中的所有 OrderManifests

使用 OPENJSONCROSS APPLY 深入了解您的对象。

这应该为您完成:

SELECT j.CustomerId,o.OrderId, m.ShippedProductId, m.ProductId
FROM OPENJSON(@myJson)
WITH (
    CustomerId NVARCHAR(1000),
    Orders NVARCHAR(MAX) AS JSON
) j
CROSS APPLY OPENJSON(j.Orders)
WITH (
    OrderId NVARCHAR(1000),
    OrderManifests NVARCHAR(MAX) AS JSON
) o
CROSS APPLY OPENJSON(o.OrderManifests)
WITH (
    ShippedProductId INT,
    ProductId int
) m
WHERE m.ShippedProductId = m.ProductId;

这个查询 returns:

CustomerId  |  OrderId  |  ShipedProductId  |  ProductId
------------+-----------+-------------------+-------------
123456      |    852    |       884         |     884
------------+-----------+-------------------+-------------
123456      |   5681    |      8188         |    8188