Могу ли я использовать FOR JSON без указания имени исходного столбца в SQL Server 2016? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть таблица, которая содержит строки json с идентификатором группы. Я хочу создать массив json, который содержит все объекты json с одинаковым идентификатором.

Обратите внимание, что в моем случае содержимое столбца, которое я пытаюсь поместить в массив, представляет собой фрагменты json, поэтому мой случай и вопрос более конкретны, чем превращение строк в массив. Использование OPENJSON в принятом ответе также усиливает эту деталь.

Однако я не смог найти способ использования FOR JSON, который позволял бы мне выбирать один столбец, а имя этого столбца не становилось ключом для всех объектов в массиве.

Я понимаю, что ключ, от которого я пытаюсь избавиться, необходим для проецирования столбцов на ключи представления значения ключа json, но в этом случае я выбираю только один столбец, и мне любопытно, есть ли уловка, о которой я не могу думать.

Я могу достичь того, чего хочу, просто используя COALASCE, но я хотел бы знать, возможно ли обработать этот крайний случай, используя FOR JSON. Вот упрощенный код, который демонстрирует, что я пытаюсь сделать:

BEGIN
    declare @Json_Snippets table (id int, json nvarchar(max));

    insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"one"}}');
    insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"two"}}');

   select
          JSON_QUERY(js.json) as 'dont_want_this'
   from
        @Json_Snippets js
    FOR JSON PATH;

END

Мне нужно JSON_QUERY, чтобы избежать экранирования символов в столбце json, т. Е. Строка json остается как json. Запуск выше дает:

[{"dont_want_this":{"root":{"obj":"one"}}},{"dont_want_this":{"root":{"obj":"two"}}}]

Я бы хотел получить:

[{"root":{"obj":"one"}},{"root":{"obj":"two"}}]

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

Если я правильно вас понимаю, следующий подход может помочь.Просто выберите данные json с помощью предложений OPENJSON() и WITH, затем отформатируйте результаты с помощью FOR JSON:

-- Table
declare @Json_Snippets table (id int, json nvarchar(max));
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"one"}}');
insert into @Json_Snippets (id, json) VALUES (1, '{"root":{"obj":"two"}}');

-- Statement
SELECT j.[root]
FROM @Json_Snippets t
CROSS APPLY OPENJSON(t.json, '$') WITH ([root] nvarchar(max) AS JSON) j
FOR JSON AUTO

Вывод:

[{"root":{"obj":"one"}},{"root":{"obj":"two"}}]
1 голос
/ 18 апреля 2019

Если вам известны корневые ключи, вы можете использовать OPENJSON() WITH (... AS JSON), чтобы извлечь их значения как json и воссоздать json, используя FOR JSON.Вот пример:

DECLARE @json_snippets TABLE (id INT, json NVARCHAR(MAX));
INSERT INTO @json_snippets (id, json) VALUES
(1, '{"root":{"obj":"one"}}'),
(1, '{"root":{"obj":"two","foo":"bar"}}'),
(2, '{"root":{"obj":"three"}}');

SELECT id, (
    SELECT j.*
    FROM @json_snippets AS x
    CROSS APPLY OPENJSON(json) WITH (
        root NVARCHAR(MAX) AS JSON
    ) AS j
    WHERE id = t.id
    FOR JSON AUTO
)
FROM @json_snippets AS t
GROUP BY id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...