MariaDB JSON_OBJECTAGG() 函数使用指南
在 MariaDB 中,JSON_OBJECTAGG()
是一个内置函数,它将由第一个参数作为键和第二个参数作为值的键值对聚合为一个 JSON 对象。
MariaDB JSON_OBJECTAGG()
语法
这里是 MariaDB JSON_OBJECTAGG()
函数的语法:
JSON_OBJECTAGG(key_expr, value_expr)
我们通常在 MariaDB 中按如下方式使用 JSON_OBJECTAGG()
函数:
SELECT JSON_OBJECTAGG(key_expr, value_expr), ...
FROM table_name
[WHERE ...]
[GROUP BY group_expr1, group_expr2, ...];
参数
key_expr
- 必须的。它的值作为结果对象中的键值对中的键。它可以是一个列名,也可以是一个表达式。
value_expr
- 可选的。它的值作为结果对象中的键值对中的值。它可以是一个列名,也可以是一个表达式。
返回值
MariaDB JSON_OBJECTAGG()
函数返回一个 JSON 对象,其中的键值对中的键是 key_expr
的值,值是 value_expr
的值。
如果存在重复的键,则只保留最后一个键作为键值对,其他重复的键值对都被丢弃。
如果结果集没有任何行,此函数将返回 NULL
。
MariaDB JSON_OBJECTAGG()
示例
我们将通过 student_score
表进行演示。
首先,让我们使用如下语句创建表 student_score
:
DROP TABLE IF EXISTS `student_score`;
CREATE TABLE `student_score` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`subject` VARCHAR(255) NOT NULL,
`score` INT NOT NULL
);
这里我们创建了表用于存储学生的成绩,这个表有 4 个列组成:
id
是主键name
是学生的名字subject
是学生的科目score
是学生的成绩
其次,让我插入一些数据用于演示:
INSERT INTO `student_score` (`name`, `subject`, `score`)
VALUES
('Tom', 'Math', 80),
('Tom', 'English', 90),
('Tim', 'English', 98);
以下是表中的数据:
+----+------+---------+-------+
| id | name | subject | score |
+----+------+---------+-------+
| 1 | Tom | Math | 80 |
| 2 | Tom | English | 90 |
| 3 | Tim | English | 98 |
+----+------+---------+-------+
基本示例
要获取一个包含了要将所有的科目和成绩 JSON 对象,请使用以下语句:
SELECT
JSON_OBJECTAGG(subject, score) AS `Scores`
FROM student_score;
输出:
+-----------------------------------------+
| Scores |
+-----------------------------------------+
| {"Math":80, "English":90, "English":98} |
+-----------------------------------------+
这显然没有太多的使用价值。通过分组您可以获得更精确的统计。
分组
通过分组,我们可以使用 JSON_OBJECTAGG()
函数获取每个人考试成绩,如下:
SELECT
name AS `Name`,
JSON_OBJECTAGG(subject, score) AS `Scores`
FROM student_score
GROUP BY name;
输出:
+------+-----------------------------+
| Name | Scores |
+------+-----------------------------+
| Tim | {"English": 98} |
| Tom | {"Math": 80, "English": 90} |
+------+-----------------------------+
在本示例中,我们按照 name
分组。结果集中的 Scores
列的值是 JSON 对象。
对于 Tim 来说,由于他只参加了一门考试,因此 JSON 对象 {"English": 98}
中只有一个键值对。
对于 Tom 来说,由于他参加了两门考试,因此 JSON 对象 {"Math": 80, "English": 90}
中有两个键值对。
结论
在 MariaDB 中,JSON_OBJECTAGG()
是一个内置函数,它将由第一个参数作为键和第二个参数作为值的键值对聚合为一个 JSON 对象。