mysql - MySQL JSONField 嵌套数组 SUM
问题描述
我在 MySQL 8.0 数据库中有一个简单的表,如下所示:
+-----------+---------+----------+
| id | data |created |
+-----------+---------+----------+
| INT | JSON |Timestamp |
+-----------+---------+----------+
我可以使用以下方法填充我的 JSONField:
INSERT INTO mytable (`data`) VALUES ('{
"File": {
"Files": {
"Accounts": {
"Account": [{
"AccountID": "11",
"AccountDescription": "CASH",
"Balance": "600.00"
}, {
"AccountID": "111",
"AccountDescription": "Cash",
"Balance": "600.00"
}]
}
}
}
}');
我想要的是提取SUM
所有 Balance 值。
我试过这个:
SELECT SUM(JSON_UNQUOTE(JSON_EXTRACT(`data`, '$.File.Files.Accounts.Account[*].Balance'))) as 'result' FROM mytable WHERE id = 1;
但是给出了结果:
+-----------+
| result |
+-----------+
| 0 |
+-----------+
另外,如果我摆脱SUM
,结果是:
+-----------------------+
| result |
+-----------------------+
| ["600.00", "600.00"] |
+-----------------------+
这让我相信这JSON_UNQUOTE
也不适用于这个嵌套数组 SELECT。
我如何查询表(最好没有自定义函数),以便它给出:
+-----------+
| result |
+-----------+
| 1200 |
+-----------+
解决方案
为了得到想要的结果,可以JSON Table Functions
在 MySQL 8.0 中使用。它将 JSON 数据转换为表格形式。然后您可以对结果使用聚合函数。
下面给出了实现相同的查询
SELECT sum(result) as result
FROM mytable,
JSON_TABLE(
`data`,
'$.File.Files.Accounts.Account[*]' COLUMNS(
NESTED PATH '$.Balance' COLUMNS (result DECIMAL PATH '$')
)
) AS jt;
DB小提琴链接如下
https://www.db-fiddle.com/f/vrn55vY2TMeVsVAzy9CS1w/11
有关 JSON 表函数的更多信息,请参见
https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html
推荐阅读
- javascript - 使用 javascript 将 base64 图像导出到 Excel
- sql - 如何使用当前行中的上一行值生成的上一个结果?
- python - 在python中编写函数指数
- c - 使用函数在 C 中求和
- atom-editor - 如何使用项目查看器在 Atom 中的项目之间切换并使用 ftp-remote-edit 在保存时将文件更新到远程服务器
- mono.cecil - 在 Mono.Cecil 对象模型中的属性和事件上,OtherMethods 属性引用了哪些方法?
- python - 用单个值替换 Column 但保留 NaN
- tensorflow - 如何使用经过训练的 RL 模型进行预测?
- performance - 为什么设置 textContent 会触发重排?
- r - 如何将新变量添加到文件列表中