Как я могу получить доступ к элементам из многомерного массива JSON (в SQL Server) - PullRequest
1 голос
/ 26 июня 2019

У меня есть многомерный массив JSON, я обращаюсь к массиву JSON в SQL Server и использую «OPENJSON» для преобразования данных JSON в SQL. В настоящее время я сталкиваюсь с проблемой извлечения данных из многомерного массива

Declare @Json nvarchar(max)

Set @Json= '[{
    "id": 0,
    "healthandSafety": "true",
    "estimationCost": "7878",
    "comments": "\"Comments\"",
    "image": [{
        "imageData": "1"
    }, {
        "imageData": "2"
    }, {
        "imageData": "3"
    }, {
        "imageData": "4"
    }, {
        "imageData": "5"
    }]
}, {
    "id": 1,
    "healthandSafety": "false",
    "estimationCost": "90",
    "comments": "\"89089\"",
    "image": [{
        "imageData": "6"
    }, {
        "imageData": "7"
    }, {
        "imageData": "8"
    }, {
        "imageData": "9"
    }, {
        "imageData": "10"
    }, {
        "imageData": "11"
    }]
}]'

Select ImageJsonFile from OPENJSON (@Json) with (ImageJsonFile nvarchar(max) '$.image[0].imageData')

Когда я попробовал вышеуказанный код, я получил следующий вывод:

ImageJsonFile
1
6

Вывод, что я ожидаю:

ImageJsonFile
1
2
3
4
5

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

У вас уже есть ответ, так что это просто добавить некоторые детали:

Следующая команда вернет все данные из вашего многомерного массива , а не только один индекс массива, который вы должны явно указать.

DECLARE @Json NVARCHAR(MAX)=
N'[{
    "id": 0,
    "healthandSafety": "true",
    "estimationCost": "7878",
    "comments": "\"Comments\"",
    "image": [{
        "imageData": "1"
    }, {
        "imageData": "2"
    }, {
        "imageData": "3"
    }, {
        "imageData": "4"
    }, {
        "imageData": "5"
    }]
}, {
    "id": 1,
    "healthandSafety": "false",
    "estimationCost": "90",
    "comments": "\"89089\"",
    "image": [{
        "imageData": "6"
    }, {
        "imageData": "7"
    }, {
        "imageData": "8"
    }, {
        "imageData": "9"
    }, {
        "imageData": "10"
    }, {
        "imageData": "11"
    }]
}]';

- запрос

SELECT A.id
      ,A.healthandSafety
      ,A.estimationCost
      ,A.comments
      ,B.imageData 
FROM OPENJSON(@Json)
WITH(id INT
    ,healthandSafety BIT
    ,estimationCost INT
    ,comments NVARCHAR(1000)
    ,[image] NVARCHAR(MAX) AS JSON ) A
CROSS APPLY OPENJSON(A.[image])
WITH(imageData INT) B;

Результат

+----+-----------------+----------------+----------+-----------+
| id | healthandSafety | estimationCost | comments | imageData |
+----+-----------------+----------------+----------+-----------+
| 0  | 1               | 7878           | Comments | 1         |
+----+-----------------+----------------+----------+-----------+
| 0  | 1               | 7878           | Comments | 2         |
+----+-----------------+----------------+----------+-----------+
| 0  | 1               | 7878           | Comments | 3         |
+----+-----------------+----------------+----------+-----------+
| 0  | 1               | 7878           | Comments | 4         |
+----+-----------------+----------------+----------+-----------+
| 0  | 1               | 7878           | Comments | 5         |
+----+-----------------+----------------+----------+-----------+
| 1  | 0               | 90             | 89089    | 6         |
+----+-----------------+----------------+----------+-----------+
| 1  | 0               | 90             | 89089    | 7         |
+----+-----------------+----------------+----------+-----------+
| 1  | 0               | 90             | 89089    | 8         |
+----+-----------------+----------------+----------+-----------+
| 1  | 0               | 90             | 89089    | 9         |
+----+-----------------+----------------+----------+-----------+
| 1  | 0               | 90             | 89089    | 10        |
+----+-----------------+----------------+----------+-----------+
| 1  | 0               | 90             | 89089    | 11        |
+----+-----------------+----------------+----------+-----------+

Идея вкратце:

Мы используем первый OPENJSON, чтобы получить элементы первого уровня. Предложение WITH назовет все элементы и вернет [image] с NVARCHAR(MAX) AS JSON. Это позволяет использовать другой OPENJSON для чтения чисел из imageData, вашего вложенного измерения, в то время как столбец id является ключом группировки.

2 голосов
/ 26 июня 2019

Вам необходимо определить путь запроса:

Select * from OPENJSON (@Json,'$[0].image') with (ImageJsonFile nvarchar(max) '$.imageData')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...