SQL OPEN JSON чтение вложенных JSON с пустым / нулевым массивом - PullRequest
1 голос
/ 30 апреля 2020

У меня есть простой JSON с вложенными массивами, некоторые из которых могут быть пустыми или нулевыми, и я не могу получить всю строку в результате из-за нулевого значения.

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'
        )
)

Я получаю этот результат :

cOrderID     cSKU          nQty          nPrice          nDiscount
------------ ------------- ------------- --------------- -----------------
1            abc           1.000000      100             10.000000

Я ожидаю получить этот результат:

cOrderID     cSKU          nQty          nPrice          nDiscount
------------ ------------- ------------- --------------- -----------------
1            abc           1.000000      100             10.000000
2            def           1.000000      111             null

Как показать строки с пустыми массивами?

1 Ответ

1 голос
/ 30 апреля 2020

Решение - 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'
    )
)

Результат в точности соответствует ожидаемому:

cOrderID     cSKU          nQty          nPrice          nDiscount
------------ ------------- ------------- --------------- -----------------
1            abc           1.000000      100             10.000000
2            def           1.000000      111             null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...