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 ?
使用 OPENJSON
和 CROSS 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
我有一个 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 ?
使用 OPENJSON
和 CROSS 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