Dynami c значения в запросе массива JSON - PullRequest
0 голосов
/ 14 июля 2020

У меня есть обычный запрос табличного выражения вроде этого.

;WITH Orders AS (
                    SELECT  OrderStatus,
                            OrderID,
                            OrderedBy,
                            OrderItems
                    FROM    Orders
                    WHERE   StudentGuid = @StudentGuid
                  )

Требуемый результат JSON массива должен выглядеть так.

[
 {
  "status":"Accepted",
  "orders":[
     {
        "OrderID":"100-1000",
        "OrderedBy":"John Smith"
     },
     {
        "OrderID":"100-1001",
        "OrderedBy":"John Smith"
     }
  ]
},
{
  "status":"Rejected",
  "orders":[
     {
        "OrderID":"100-1002",
        "OrderedBy":"John Smith"
     }
  ]
}
]

Мой текущий запрос:

SELECT CAST((
                SELECT * 
                FROM (
                        SELECT (SELECT 'Accepted') AS [OrderStatus],
                               (SELECT CAST((
                                            SELECT OrderID,
                                                   OrderedBy,
                                            FROM    Orders
                                            WHERE   [OrderStatus] = 'Accepted'
                                            FOR JSON PATH
                                            ) AS NVARCHAR(MAX))) AS Orders
                        UNION       
                        SELECT (SELECT 'Rejected') AS [OrderStatus],
                               (SELECT CAST((
                                            SELECT OrderID,
                                                   OrderedBy,
                                            FROM    Orders
                                            WHERE   [OrderStatus] = 'Rejected'
                                            FOR JSON PATH
                                            ) AS NVARCHAR(MAX))) AS Orders
                ) AS Temp FOR JSON PATH ) AS NVARCHAR(MAX))

Проблема с моим запросом в том, что это не динамический c (поскольку статус жестко запрограммирован), и «узел заказов» в конечном результате не может быть проанализирован с помощью JSON форматировщиков из-за «объединений».

Как мне удалить жесткое кодирование и сделать его динамическим c с CTE?

Спасибо!

1 Ответ

1 голос
/ 14 июля 2020

Похоже, это можно сделать с помощью подзапросов.

    SELECT DISTINCT [status],
                    (SELECT orderID, 
                            orderedBy
                    FROM    Orders AS B
                    WHERE   [Status] = A.[Status]
                                FOR JSON PATH) AS Orders
    FROM Orders AS A
...