【问题标题】:Dynamic values in JSON array queryJSON数组查询中的动态值
【发布时间】:2020-07-14 09:31:49
【问题描述】:

我有一个像这样的公用表表达式查询。

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

我的查询的问题是它不是动态的(因为状态是硬编码的),并且最终结果中的“订单节点”由于“联合”而无法被 JSON 格式化程序解析。

如何删除硬编码并使用 CTE 使其动态化?

谢谢!

【问题讨论】:

    标签: sql arrays json tsql


    【解决方案1】:

    看起来这可以使用子查询来完成。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 2021-07-15
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多