mysql jsonfield嵌套数组和

3ks5zfa0  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(458)

我在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 所有的平衡值。
我试过这个:

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      |
+-----------+
bqucvtff

bqucvtff1#

为了得到想要的结果,你可以利用 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 fiddle链接如下所示
https://www.db-fiddle.com/f/vrn55vy2tmevsvazy9cs1w/11
关于json表函数的更多信息可以在下面找到
https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html

相关问题