Извлечение массивов JSON и вставка их в виде отдельных строк в новую базу данных.

У меня есть база данных, которая использует JSON для хранения значений.

CREATE TABLE JSON(name TEXT, value TEXT);

Я пытаюсь преобразовать это в родной формат.

CREATE TABLE NATIVE(name TEXT, KEY1, KEY2, KEY3);

Формат JSON выглядит следующим образом:

[
    {"key1":value1, "key2":value2, "key3":value3},
    {"key1":value4, "key2":value5, "key3":value6},
    ....
]

Для приведенного выше примера, я пытаюсь придумать запрос, используя INSERT INTO NATIVE (name, KEY1, KEY2, KEY3) SELECT <something> FROM JSON произвести эту таблицу:

+------+---------+--------+--------+
| TEXT | KEY1    | KEY2   | KEY3   |
+------+---------+--------+--------+
| TEXT | VALUE1  | VALUE2 | VALUE3 |
| TEXT | VALUE4  | VALUE5 | VALUE3 |
...
+------+---------+--------+--------+

Я использовал JSON1 для других таблиц, которые используют простые объекты. Так, например, когда у меня есть значения, которые являются объектами, а не массивами объектов, я могу использовать json_extract для каждого поля.

Для массива я думаю, что я должен использовать json_each но мне трудно понять, как применить это к этой конкретной проблеме.

2 ответа

Я придумал это решение:

INSERT INTO NATIVE (name, key1, key2, key3)
SELECT name, json_extract(x.value, '$.key1') 
           , json_extract(x.value, '$.key2')
           , json_extract(x.value, '$.key3')
FROM JSON, json_each(JSON.value) AS x;

Хитрость в том, что json_each при использовании вместе с таблицей, содержащей JSON, а SELECT возвращает строки, в которых есть поля, называемые key а также value которые содержат каждый ключ и значение. Тогда можно позвонить json_extract в select, чтобы выбрать отдельные поля, которые затем могут быть вставлены в новую таблицу.

Мы можем попробовать использовать JSON_EXTRACT функция от json1 библиотека расширения, наряду с INSERT INTO ... SELECT:

INSERT INTO NATIVE(name TEXT, KEY1, KEY2, KEY3)
SELECT
    name,
    JSON_EXTRACT(value, '$.key1'),
    JSON_EXTRACT(value, '$.key2'),
    JSON_EXTRACT(value, '$.key3')
FROM JSON;

Это предполагает, что это value колонка в JSON который содержит сырой JSON. Если нет, то заменить value в приведенном выше запросе по любому столбцу содержит содержимое JSON.

Другие вопросы по тегам