Как запросить значения JSON из столбца в один массив JSON в MS-SQL 2016? - PullRequest
0 голосов
/ 21 марта 2019

Я начинаю выяснять, как обрабатывать JSON в MSSQL 2016+

Я просто создал таблицу, имеющую столбец ID (int) и JSON (nvarchar).

Здесьмои запросы, чтобы показать проблему:

Первый запрос просто возвращает результат реляционной таблицы, хорошо и как ожидалось.

SELECT * FROM WS_Test

-- Results:

1   { "name": "thomas" }
2   { "name": "peter" }

Второй запрос возвращает только столбец json, поскольку "JSON" создал мойMSSQL.
Не очень приятно, потому что он выводит содержимое столбца json в виде строки, а не как проанализированный JSON.

SELECT json FROM WS_Test FOR JSON PATH

-- Results: 

[{"json":"{ \"name\": \"thomas\" }"},{"json":"{ \"name\": \"peter\" }"}]

Третий запрос дает мне две строки результата с содержимым столбца json в виде проанализированного JSON, хорошо.

SELECT JSON_QUERY(json, '$') as json FROM WS_Test

-- Results:

{ "name": "thomas" }
{ "name": "peter" }

Четвертый запрос дает мне содержимое столбца json как ОДИН (!) Объект JSON, отлично проанализированный.

SELECT JSON_QUERY(json, '$') as json FROM WS_Test FOR JSON PATH

-- Results:

[{"json":{ "name": "thomas" }},{"json":{ "name": "peter" }}]

НО: я не хочу иметь свойство "json", содержащее содержимое столбца json в каждом объекте массива примера четыре.Я просто хочу один массив, содержащий содержимое столбца, не меньше, не больше.Вот так:

[
    {
        "name": "peter"
    },
    {
        "name": "thomas"
    }
]

Как мне заархивировать это только с помощью T-SQL?Это вообще возможно?

1 Ответ

1 голос
/ 21 марта 2019

Предложение FOR JSON всегда будет включать имена столбцов - однако вы можете просто объединить все значения в столбце json в один результат, а затем добавить квадратные скобки вокруг этого.

Сначала создайте и заполните образец таблицы ( Пожалуйста, сохраните этот шаг в своих будущих вопросах):

CREATE TABLE WS_Test
(
    Id int, 
    Json nvarchar(1000)
);

INSERT INTO WS_Test(Id, Json) VALUES
(1, '{ "name": "thomas" }'),
(2, '{ "name": "peter" }');

Для SQL Server 2017 или более поздней версии используйте встроенную функцию string_agg:

SELECT '[' + STRING_AGG(Json, ',') + ']' As Result
FROM WS_Test

Для более низких версий вы можете использовать for xml path с stuff, чтобы получить тот же результат, что и string_agg:

SELECT STUFF(
(
    SELECT ',' + Json
    FROM WS_Test
    FOR XML PATH('')
), 1, 1, '[')+ ']' As Result

Результат для обоих этих запросовбудет это:

Result
[{ "name": "thomas" },{ "name": "peter" }]

Вы можете увидеть живую демонстрацию на DB <> Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...