我有一个使用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
,但是我很难弄清楚如何将其应用于这个特定问题。
答案 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的表结合使用时,将返回行,其中包含名为key
和value
的字段,其中包含每个键和值。然后可以在选择中调用json_extract
来挑选单个字段,然后将其插入新表中。