Чтение массива JSON как одного из столбцов таблицы SQL - PullRequest
0 голосов
/ 18 сентября 2018

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

Ниже приведен образец JSON:

DECLARE @json NVARCHAR(MAX) = '[
  {
     "Id":1,
     "Name":"Test1",
     "Languages":["L1", "L2"]
  },
  {
     "Id":2,
     "Name":"Test2",
     "Languages":["L3", "L4"]
  },
  {
     "Id":3,
     "Name":"Test2",
     "Languages":["L5", "L6"]
  }]'

Ниже приведен запрос, который я использую:

SELECT Id
     , Name 
     , Languages
  FROM OPENJSON(@json)
  WITH (Id INT '$.Id'
     , Name VARCHAR(20) '$.Name'
     , Languages VARCHAR(200) '$.Languages')

Ниже приведен текущий результат:

enter image description here

Однако мне нужен результат, как показано ниже

enter image description here

Что я делаю не так? Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете использовать NVARCHAR(max) as json для элемента Language внутри WITH предложения.

Из документов Microsoft (все подробности можно найти здесь ):

Если вы не укажете AS JSON для столбца, функция возвращает скалярное значение (например, int, string, true, false) из указанного свойства JSON по указанному пути. Если путь представляет объект или массив, и свойство не может быть найдено по указанному пути, функция возвращает ноль в слабом режиме или возвращает ошибку в строгом режиме.Это поведение похоже на поведение функции JSON_VALUE.

Таким образом, ваш запрос должен выглядеть следующим образом:

SELECT Id
     , Name 
     , Languages
  FROM OPENJSON(@json)
  WITH (Id INT '$.Id'
     , Name VARCHAR(20) '$.Name'
     , Languages NVARCHAR(max) as json)

Результаты:

enter image description here

0 голосов
/ 18 сентября 2018

Надеюсь, возможно, этот запрос поможет вам. Результат немного отличается от желаемого.

DECLARE @json NVARCHAR(MAX) = '{"UserLang":[
  {
     "Id":1,
     "Name":"Test1",
     "Languages":["L1", "L2"]
  },
  {
     "Id":2,
     "Name":"Test2",
     "Languages":["L3", "L4"]
  },
  {
     "Id":3,
     "Name":"Test2",
     "Languages":["L5", "L6"]
  }]}'

SELECT 
JSON_VALUE(d.value,'$.Id') AS Id,
JSON_VALUE(d.value,'$.Name') AS Languages,
l.value AS Name
  FROM OPENJSON(@json,'$.UserLang') AS d CROSS APPLY OPENJSON (d.value,'$.Languages') AS l
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...