我在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"
}]
}
}
}
}');
我想要提取所有Balance值的SUM
。
我尝试过:
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 |
+-----------+
答案 0 :(得分:3)
为了获得所需的结果,可以在MySQL 8.0中使用JSON Table Functions
。它将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;
数据库小提琴链接如下所示
https://www.db-fiddle.com/f/vrn55vY2TMeVsVAzy9CS1w/11
有关JSON表函数的更多信息,请参见以下
https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html