SQL - генерировать массив JSON без имен столбцов - PullRequest
0 голосов
/ 01 ноября 2019

Допустим, у нас есть эти данные

CREATE TABLE [dbo].[tValues]
(
    [cValue] [VARCHAR](50) NULL
) ON [PRIMARY]

INSERT INTO [dbo].[tValues] ([cValue]) 
VALUES ('red'), ('green'), ('blue'), ('brown')

Из этого запроса:

SELECT 
    (JSON_QUERY((SELECT 
                     'Ball' AS title, 
                     '20cm' AS size,
                     (SELECT cValue FROM tValues FOR JSON PATH) AS [colors]
                 FOR JSON PATH))) AS product
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

Я получил такой результат JSON:

{
    "product": [
                 { "title":"Ball", 
                   "size":"20cm", 
                   "colors": [
                                { "cValue": "red" },
                                { "cValue": "green" },
                                { "cValue": "blue" },
                                { "cValue": "brown" }
                             ]
                 }
               ]
}

Но мне нужно безимена столбцов и фигурные скобки в теге colors, например:

{
    "product": [
                  {
                      "title": "Ball",
                      "size": "20cm",
                      "colors": [ "red", "green", "blue", "brown" ]
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  }
               ]
}

Как это сделать?

1 Ответ

2 голосов
/ 01 ноября 2019

Одним из возможных решений является использование for xml path с stuff для построения массива:

SELECT 
    (JSON_QUERY((SELECT 
                     'Ball' AS title, 
                     '20cm' AS size,
                      JSON_QUERY(
                    '[' + STUFF(( SELECT ',' + '"' + cValue + '"' 
                    FROM tValues 
                    FOR XML PATH('')),1,1,'') + ']' ) AS [colors]
                 FOR JSON PATH)

                 )) AS product
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

Результат:

{
   "product":[
      {
         "title":"Ball",
         "size":"20cm",
         "colors":[
            "red",
            "green",
            "blue",
            "brown"
         ]
      }
   ]
}
...