MySQL 5.7:将简单的 JSON_ARRAY 转换为行
MySQL 5.7 : convert simple JSON_ARRAY to rows
我有一个简单的 table,其中有一个像这样的 JSON_ARRAY 列:
+----+---------+
| id | content |
+----+---------+
| 1 | [3, 4] |
| 2 | [5, 6] |
+----+---------+
我想列出特定 ID 的所有内容引用
SELECT JSON_EXTRACT(content, '$') as res FROM table WHERE id=1
但我希望结果成行:
+-----+
| res |
+-----+
| 3 |
| 4 |
+-----+
您可以在 MySQL 8.0 中使用 JSON_TABLE():
select r.res from mytable,
json_table(mytable.content, '$[*]' columns (res int path '$')) r
where mytable.id = 1
我在 MySQL 8.0.17 上测试,这是输出:
+------+
| res |
+------+
| 3 |
| 4 |
+------+
如果您使用早于 MySQL 8.0 的版本,您有以下选项:
- 找到一些不可能复杂的 SQL 解决方案。这几乎总是解决问题的错误方法,因为您最终得到的代码维护成本太高。
- 按原样获取 JSON 数组,并在应用程序代码中分解它。
- 规范化您的数据,以便每行有一个值,而不是使用 JSON 数组。
我经常在 Stack Overflow 上找到关于在 MySQL 中使用 JSON 的问题,这些问题让我相信这个功能已经毁了 MySQL。开发人员继续不恰当地使用它。他们喜欢它使 插入 半结构化数据变得容易,但他们发现这使得 查询 数据过于复杂。
我有一个简单的 table,其中有一个像这样的 JSON_ARRAY 列:
+----+---------+
| id | content |
+----+---------+
| 1 | [3, 4] |
| 2 | [5, 6] |
+----+---------+
我想列出特定 ID 的所有内容引用
SELECT JSON_EXTRACT(content, '$') as res FROM table WHERE id=1
但我希望结果成行:
+-----+
| res |
+-----+
| 3 |
| 4 |
+-----+
您可以在 MySQL 8.0 中使用 JSON_TABLE():
select r.res from mytable,
json_table(mytable.content, '$[*]' columns (res int path '$')) r
where mytable.id = 1
我在 MySQL 8.0.17 上测试,这是输出:
+------+
| res |
+------+
| 3 |
| 4 |
+------+
如果您使用早于 MySQL 8.0 的版本,您有以下选项:
- 找到一些不可能复杂的 SQL 解决方案。这几乎总是解决问题的错误方法,因为您最终得到的代码维护成本太高。
- 按原样获取 JSON 数组,并在应用程序代码中分解它。
- 规范化您的数据,以便每行有一个值,而不是使用 JSON 数组。
我经常在 Stack Overflow 上找到关于在 MySQL 中使用 JSON 的问题,这些问题让我相信这个功能已经毁了 MySQL。开发人员继续不恰当地使用它。他们喜欢它使 插入 半结构化数据变得容易,但他们发现这使得 查询 数据过于复杂。