mysql5.7版本json原生函式初體驗
阿新 • • 發佈:2018-12-08
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.18-log |
+------------+
1 row in set (0.00 sec)
- 測試資料
mysql> select disk from device_status limit 1;
+--------------------------------------------------------------------------------------+
| disk |
+--------------------------------------------------------------------------------------+
| {"used": 366975299584, "total": 994344431616, "percent": 36.9, "free": 627369132032} |
+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
json_extract()函式使用
解析json資料,並打散重新排序
mysql> select json_extract(disk,'$.*') from device_status limit 1;
+--------------------------------------------------+
| json_extract(disk,'$.*') |
+--------------------------------------------------+
| [627369132032, 366975299584, 994344431616, 36.9] |
+--------------------------------------------------+
1 row in set (0.00 sec)
- 解析json中某個資料
mysql> select json_extract(disk,'$.used') used from device_status limit 1;
+--------------+
| used |
+--------------+
| 366975299584 |
+--------------+
1 row in set (0.00 sec)
- 聚合
mysql> select count(*) count, sum(json_extract(disk,'$.used')) used_sum from device_status limit 1;
+-------+-----------------+
| count | used_sum |
+-------+-----------------+
| 2000 | 498959377707008 |
+-------+-----------------+
1 row in set (0.01 sec)
- 查詢
mysql> select * from setting;
+---------------------+----------------+
| name | value |
+---------------------+----------------+
| access_ips | [] |
| error_count | 5 |
| life_time | 20 |
| password_min_length | 8 |
| password_includes | ["lower_case"] |
+---------------------+----------------+
5 rows in set (0.00 sec)
mysql> select * from setting where json_contains(value, '"lower_case"');
+-------------------+----------------+
| name | value |
+-------------------+----------------+
| password_includes | ["lower_case"] |
+-------------------+----------------+
1 row in set (0.00 sec)
mysql> select count(*), avg(json_extract(cpu, '$.idle')) from device_status where cpu->'$.idle' = 96.7;
+----------+----------------------------------+
| count(*) | avg(json_extract(cpu, '$.idle')) |
+----------+----------------------------------+
| 14 | 96.7000 |
+----------+----------------------------------+
1 row in set (0.01 sec)
mysql> select count(*), avg(json_extract(cpu,'$.idle')) from device_status where json_contains(cpu,'96.7','$.idle');
+----------+---------------------------------+
| count(*) | avg(json_extract(cpu,'$.idle')) |
+----------+---------------------------------+
| 14 | 96.7000 |
+----------+---------------------------------+
1 row in set (0.01 sec)