Извлечение массивов JSON и вставка их в виде отдельных строк в новую базу данных. - PullRequest
0 голосов
/ 30 мая 2019

У меня есть база данных, которая использует 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 ]

0 голосов
/ 30 мая 2019

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

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 в функции выбора, чтобы выбрать отдельные поля, которые затем можно вставить в новую таблицу.

0 голосов
/ 30 мая 2019

Мы можем попробовать использовать функцию 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.

...