MySQL JSON_TABLE: извлечь вложенный массив в строки

Категория: Backend · Язык: SQL · Обновлено:

JSON_TABLE() разворачивает вложенные JSON-массивы в строки, чтобы их можно было соединять и фильтровать обычным SQL. Результат можно сортировать и связывать с другими таблицами без отдельного разбора JSON в приложении.

Развернуть заказы и позиции

Пусть в events.payload лежит объект с массивом orders, а каждый заказ содержит массив items:

SQL
SELECT
    e.id AS event_id,
    jt.order_pos,
    jt.order_id,
    jt.item_pos,
    jt.sku,
    jt.qty
FROM events AS e
CROSS JOIN JSON_TABLE(
    e.payload,
    '$.orders[*]' COLUMNS (
        order_pos FOR ORDINALITY,
        order_id BIGINT PATH '$.id',
        NESTED PATH '$.items[*]' COLUMNS (
            item_pos FOR ORDINALITY,
            sku VARCHAR(64) PATH '$.sku' NULL ON EMPTY,
            qty INT PATH '$.qty' DEFAULT '1' ON EMPTY
        )
    )
) AS jt
ORDER BY e.id, jt.order_pos, jt.item_pos;

FOR ORDINALITY нумерует элементы с 1. NESTED PATH создаёт строки для items; если вложенный массив пуст или отсутствует, его столбцы будут NULL. Чтобы оставить только найденные позиции, добавьте WHERE jt.item_pos IS NOT NULL.

Функция доступна в MySQL 8.0.4+. Значения JSON приводятся к указанным SQL-типам, поэтому подберите типы по своей схеме и отдельно решите, считать ли некорректные значения ошибкой. См. MySQL JSON Table Functions.