提取JSON数组并将其作为单独的行插入新数据库中

时间:2019-05-30 04:08:31

标签: sqlite sqlite-json1

我有一个使用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 :(得分:0)

我们可以尝试使用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内容的任何列。

答案 1 :(得分:0)

我想出了这个解决方案:

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的表结合使用时,将返回行,其中包含名为keyvalue的字段,其中包含每个键和值。然后可以在选择中调用json_extract来挑选单个字段,然后将其插入新表中。