Как использовать массив json для извлечения различных значений из JSON документа? - PullRequest
0 голосов
/ 02 апреля 2020

Я использую 8.0.18-commercial и пишу следующий запрос MySQL для формирования cross join with JSON documents.

Обратите внимание, что количество записей в servers[] совпадает с количеством записей в objectIds[] В servers[] должна быть одна запись, соответствующая записи в objectIds[]

SELECT t1.networkInfo->>"$.*" AS network, 
t1.objectIds,
j.server
FROM table1 t1
CROSS JOIN JSON_TABLE(t1.servers, 
                      "$[*]" COLUMNS (
                        server VARCHAR(20) PATH '$'
                        )
                      ) j
WHERE t1.id = 56

Вывод

network                             server                  objectIds
["abc.com", "Linux123", "RHEL"]     Server123       ["objectId123", "objectId1231", "objectId1232"]
["abc.com", "Linux123", "RHEL"]     Server1231      ["objectId123", "objectId1231", "objectId1232"]
["abc.com", "Linux123", "RHEL"]     Server1232      ["objectId123", "objectId1231", "objectId1232"]

Я хочу добавить еще одно объединение в запрос, чтобы вывод выглядел следующим образом:

Ожидаемый вывод

network                             server           objectIds
["abc.com", "Linux123", "RHEL"]     Server123        objectId123
["abc.com", "Linux123", "RHEL"]     Server1231       objectId1231
["abc.com", "Linux123", "RHEL"]     Server1232       objectId1232

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете получить желаемый результат, распаковав столбец objectIds так же, как столбец servers, добавив столбец с номером строки к каждому JSON_TABLE, используя FOR ORDINALITY и используя номер этой строки в JOIN таблицах servers и objectIds:

SELECT t1.networkInfo->>"$.*" AS network, s.server, o.objectId
FROM table1 t1
CROSS JOIN JSON_TABLE(t1.servers, 
                      "$[*]" COLUMNS (
                        rownum FOR ORDINALITY,
                        server VARCHAR(20) PATH '$'
                        )
                      ) s
JOIN JSON_TABLE(t1.objectIds, 
                "$[*]" COLUMNS (
                  rownum FOR ORDINALITY,
                  objectId VARCHAR(20) PATH '$'
                  )
                ) o ON o.rownum = s.rownum
WHERE t1.id = 56

Вывод:

network                             server      objectId
["abc.com", "Linux123", "RHEL"]     Server123   objectId123
["abc.com", "Linux123", "RHEL"]     Server1231  objectId1231
["abc.com", "Linux123", "RHEL"]     Server1232  objectId1232

Демонстрация на dbfiddle

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