JSON_TABLE 有其他选择吗?
Is there any alternative to JSON_TABLE?
我在 MySQL 中有一个 table,有一列 json 像这样
id col
1 [{"key": 1, "value": 9}, {"key": 2, "value": 8}, {"key": 3, "value": 7}, ...]
2 [{"key": 1, "value": 6}, {"key": 2, "value": 5}, {"key": 3, "value": 4}, ...]
...
我需要在
中转换它
id key value
1 1 9
1 2 8
1 3 7
2 1 6
2 2 5
2 3 4
由于公司和服务器的原因,我无法创建临时文件table。我也不能使用 JSON_TABLE
。它应该在一个查询中。有什么解决办法吗?或者我应该将 mysql 更新到版本 8?
这是我在 MySQL 5.7 上测试的解决方案:
select * from (
select id,
json_unquote(json_extract(col, concat('$[',n.i,'].key'))) as `key`,
json_unquote(json_extract(col, concat('$[',n.i,'].value'))) as `value`
from mytable
cross join (select 0 as i union select 1 union select 2 union select 3 union select 4 union select 5) as n
) as t
where t.`key` is not null
order by id, `key`;
给定测试数据的输出:
+------+------+-------+
| id | key | value |
+------+------+-------+
| 1 | 1 | 9 |
| 1 | 2 | 8 |
| 1 | 3 | 7 |
| 2 | 1 | 6 |
| 2 | 2 | 5 |
| 2 | 3 | 4 |
+------+------+-------+
由您决定使用 union
的子查询是否有足够的术语来说明您可能遇到的最长 JSON 数组。
如果这看起来太难了,那么 JSON 可能不是存储数据的正确方法。您应该将它们存储在每个对象的一个单独的行中,具有正常的列 key
和 value
.
我在 MySQL 中有一个 table,有一列 json 像这样
id col
1 [{"key": 1, "value": 9}, {"key": 2, "value": 8}, {"key": 3, "value": 7}, ...]
2 [{"key": 1, "value": 6}, {"key": 2, "value": 5}, {"key": 3, "value": 4}, ...]
...
我需要在
中转换它id key value
1 1 9
1 2 8
1 3 7
2 1 6
2 2 5
2 3 4
由于公司和服务器的原因,我无法创建临时文件table。我也不能使用 JSON_TABLE
。它应该在一个查询中。有什么解决办法吗?或者我应该将 mysql 更新到版本 8?
这是我在 MySQL 5.7 上测试的解决方案:
select * from (
select id,
json_unquote(json_extract(col, concat('$[',n.i,'].key'))) as `key`,
json_unquote(json_extract(col, concat('$[',n.i,'].value'))) as `value`
from mytable
cross join (select 0 as i union select 1 union select 2 union select 3 union select 4 union select 5) as n
) as t
where t.`key` is not null
order by id, `key`;
给定测试数据的输出:
+------+------+-------+
| id | key | value |
+------+------+-------+
| 1 | 1 | 9 |
| 1 | 2 | 8 |
| 1 | 3 | 7 |
| 2 | 1 | 6 |
| 2 | 2 | 5 |
| 2 | 3 | 4 |
+------+------+-------+
由您决定使用 union
的子查询是否有足够的术语来说明您可能遇到的最长 JSON 数组。
如果这看起来太难了,那么 JSON 可能不是存储数据的正确方法。您应该将它们存储在每个对象的一个单独的行中,具有正常的列 key
和 value
.