Разобрать этот файл JSON, чтобы поместить значения в строки и столбцы. - PullRequest
2 голосов
/ 03 ноября 2019

У меня есть JSON-файл, который генерируется и загружается каждую ночь в SQL Server в виде одной записи (это код и изображение записи)

INSERT INTO DTReport.JSON_TEST (DATE, [log])
Select  getdate(),BulkColumn
FROM OPENROWSET (BULK 'c:\BROWSER.JSON', SINGLE_CLOB) as j

enter image description here

Что я хочу сделать, это проанализировать данные и создать отдельную строку (и отметку времени) для каждой записи

Таким образом, таблица будет просто

Col1        Col2                 Col3
(Date)      (Browser Version)   (COUNT)
11/2/2019    IE7                 620
11/2/2019    IE11                599
etc....

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

FILE CONTENTS
BROWSER.JSON
{"extrapolationLevel":1,"columnNames":["top(browserMajorVersion,10)","count(*)"],"values":[["IE 7",620],["IE 11",559],["Chrome 78",477],["Chrome 77",406],["Firefox 69",152],["Edge 18",79],["Chrome Mobile 78",75],["Firefox 70",74],["Safari mobile 13",48],["Chrome 76",43]]}

1 Ответ

1 голос
/ 03 ноября 2019

Вы можете использовать следующий пример как один из возможных подходов. Объект values представляет собой массив JSON, поэтому вам необходим дополнительный оператор APPLY, использующий второй OPENJSON() вызов:

Данные JSON:

DECLARE @json nvarchar(max) = N'{
   "extrapolationLevel":1,
   "columnNames":[
      "top(browserMajorVersion,10)",
      "count(*)"
   ],
   "values":[
      [
         "IE 7",
         620
      ],
      [
         "IE 11",
         559
      ],
      [
         "Chrome 78",
         477
      ],
      [
         "Chrome 77",
         406
      ],
      [
         "Firefox 69",
         152
      ],
      [
         "Edge 18",
         79
      ],
      [
         "Chrome Mobile 78",
         75
      ],
      [
         "Firefox 70",
         74
      ],
      [
         "Safari mobile 13",
         48
      ],
      [
         "Chrome 76",
         43
      ]
   ]
}'

Таблица:

CREATE TABLE JSON_TEST (DATE date, [log] nvarchar(max))
INSERT INTO JSON_TEST (DATE, [log]) 
VALUES (GETDATE(), @json)

Заявление:

SELECT t.[DATE], j.*
FROM JSON_TEST t
CROSS APPLY OPENJSON(t.log, '$.values') WITH (
   BrowserVersion varchar(50) '$[0]',
   [Count] int '$[1]'
) j

Результат:

DATE        BrowserVersion  Count
03/11/2019  IE 7              620
03/11/2019  IE 11             559
03/11/2019  Chrome 78         477
03/11/2019  Chrome 77         406
03/11/2019  Firefox 69        152
03/11/2019  Edge 18            79
03/11/2019  Chrome Mobile 78   75
03/11/2019  Firefox 70         74
03/11/2019  Safari mobile 13   48
03/11/2019  Chrome 76          43

Примечания (JSON основы):

  • Когда вы хотитепроанализируйте JSON строку и получите результаты в виде таблицы, используйте OPENJSON табличную функцию с заданной по умолчанию или явной схемой.
  • Функция JSON_QUERY извлекает объект или массивиз строки JSON. Если значение не является объектом или массивом, результатом будет NULL в режиме lax и ошибка в режиме strict.
  • Функция JSON_VALUE извлекает скалярное значение изJSON строкаЕсли path указывает на не скалярное значение, результатом будет NULL в режиме lax и ошибка в режиме strict
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...