hog*_*gar 1 sql t-sql arrays json nested
我有简单的 JSON 和嵌套数组,其中一些可能为空或为 null,并且由于 null 值,我无法获得整个结果行。
declare @json nvarchar(max)
set @json = '{"orders": [{
"id": 1,
"items":
[{
"sku": "abc",
"quantity": 1,
"price": 100,
"discount":
[{
"amount": "10",
"amount_set":
{
"shop":
{
"total": "10",
"currency_code": "EUR"
},
"presentment":
{
"total": "10",
"currency_code": "EUR"
}
}
}]
}]
},{
"id": 2,
"items":
[{
"sku": "def",
"quantity": 1,
"price": 111,
"discount": []
}]
}
] }'
SELECT cOrderID, cSKU, nQty, nPrice, nDiscount
FROM
(
OPENJSON(@json, '$.orders')
WITH (
cOrderID NVARCHAR(20) '$.id',
Items NVARCHAR(MAX) '$.items' AS JSON
)
CROSS APPLY OPENJSON(Items,'$')
WITH (
cSKU NVARCHAR(30) '$.sku',
nQty DECIMAL(19,6) '$.quantity',
nPrice FLOAT '$.price',
Discount NVARCHAR(MAX) '$.discount' AS JSON
)
CROSS APPLY OPENJSON(Discount,'$')
WITH (
nDiscount DECIMAL(19,6) '$.amount'
)
)
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
cOrderID cSKU nQty nPrice nDiscount
------------ ------------- ------------- --------------- -----------------
1 abc 1.000000 100 10.000000
Run Code Online (Sandbox Code Playgroud)
我期望得到这个结果:
cOrderID cSKU nQty nPrice nDiscount
------------ ------------- ------------- --------------- -----------------
1 abc 1.000000 100 10.000000
2 def 1.000000 111 null
Run Code Online (Sandbox Code Playgroud)
如何显示带有空数组的行?
解决方案是在数组OUTER APPLY上Discount:
SELECT cOrderID, cSKU, nQty, nPrice, nDiscount
FROM
(
OPENJSON(@json, '$.orders')
WITH (
cOrderID NVARCHAR(20) '$.id',
Items NVARCHAR(MAX) '$.items' AS JSON
)
CROSS APPLY OPENJSON(Items,'$')
WITH (
cSKU NVARCHAR(30) '$.sku',
nQty DECIMAL(19,6) '$.quantity',
nPrice FLOAT '$.price',
Discount NVARCHAR(MAX) '$.discount' AS JSON
)
OUTER APPLY OPENJSON(Discount,'$')
WITH (
nDiscount DECIMAL(19,6) '$.amount'
)
)
Run Code Online (Sandbox Code Playgroud)
结果完全符合预期:
cOrderID cSKU nQty nPrice nDiscount
------------ ------------- ------------- --------------- -----------------
1 abc 1.000000 100 10.000000
2 def 1.000000 111 null
Run Code Online (Sandbox Code Playgroud)