MySQL JSON 任意键到 table
MySQL JSON with arbitrary keys to table
有一个地图嵌套在一个大的 json 负载中,例如
{
"map": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
// more stuff
}
我想生成这样的 table:
+------#--------+
| Key | Value |
+------#--------+
| key1 | value1 |
| key2 | value2 |
| key3 | value3 |
+------#--------+
我唯一能想到的就是写一个循环遍历JSON_KEYS的存储函数,将所有键值对转换成
[{"key":"key1", "value":"value1"}, {"key":"key2", "value":"value2"}, ...]
这使得 JSON_TABLE 的任务变得微不足道。
有没有更快更优雅的方式?
你做得很好,甚至企业项目也这样做
这是一个解决方案:
select j.key, json_unquote(json_extract(m.data, concat('$.map.', j.key))) as value from mytable as m
cross join json_table(json_keys(m.data, '$.map'), '$[*]' columns (`key` varchar(10) path '$')) as j
输出样本数据:
+------+--------+
| key | value |
+------+--------+
| key1 | value1 |
| key2 | value2 |
| key3 | value3 |
+------+--------+
如果该查询看起来不够优雅或难以维护,那么您可能是对的。如果您想要简单或优雅的查询,则不应将数据存储在 JSON 中。
有一个地图嵌套在一个大的 json 负载中,例如
{
"map": {
"key1": "value1",
"key2": "value2",
"key3": "value3"
},
// more stuff
}
我想生成这样的 table:
+------#--------+
| Key | Value |
+------#--------+
| key1 | value1 |
| key2 | value2 |
| key3 | value3 |
+------#--------+
我唯一能想到的就是写一个循环遍历JSON_KEYS的存储函数,将所有键值对转换成
[{"key":"key1", "value":"value1"}, {"key":"key2", "value":"value2"}, ...]
这使得 JSON_TABLE 的任务变得微不足道。
有没有更快更优雅的方式?
你做得很好,甚至企业项目也这样做
这是一个解决方案:
select j.key, json_unquote(json_extract(m.data, concat('$.map.', j.key))) as value from mytable as m
cross join json_table(json_keys(m.data, '$.map'), '$[*]' columns (`key` varchar(10) path '$')) as j
输出样本数据:
+------+--------+
| key | value |
+------+--------+
| key1 | value1 |
| key2 | value2 |
| key3 | value3 |
+------+--------+
如果该查询看起来不够优雅或难以维护,那么您可能是对的。如果您想要简单或优雅的查询,则不应将数据存储在 JSON 中。