MariaDB JSON_ARRAYAGG() 函数使用指南

在 MariaDB 中,JSON_ARRAYAGG() 是一个内置函数,它将指定的列或者表达式的值聚合为一个 JSON 数组。

MariaDB JSON_ARRAYAGG() 语法

这里是 MariaDB JSON_ARRAYAGG() 函数的语法:

JSON_ARRAYAGG(
  [DISTINCT] expr [,expr ...]
  [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]]
  [LIMIT {[offset,] row_count | row_count OFFSET offset}]
)

我们通常在 MariaDB 中按如下方式使用 JSON_ARRAYAGG() 函数:

SELECT JSON_ARRAYAGG(expr), ...
FROM table_name
[WHERE ...]
[GROUP BY group_expr1, group_expr2, ...];

参数

expr
必须的。它可以是一个列名,也可以是一个表达式。

返回值

MariaDB JSON_ARRAYAGG(expr) 函数返回一个 JSON 数组,它聚合了所有符合条件的值。

如果结果集没有任何行,此函数将返回 NULL

MariaDB JSON_ARRAYAGG() 示例

我们将通过 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_ARRAYAGG(subject) AS `Subjects`
FROM student_score;

输出:

+------------------------------+
| Subjects                     |
+------------------------------+
| ["Math","English","English"] |
+------------------------------+

您会发现返回的结果中含有重复的名称。您可以使用 DISTINCT 关键字获取唯一值:

SELECT
    JSON_ARRAYAGG(DISTINCT subject) AS `Subjects`
FROM student_score;

输出:

+--------------------+
| Subjects           |
+--------------------+
| ["English","Math"] |
+--------------------+

分组

通过分组,我们可以使用 JSON_ARRAYAGG() 函数获取每个人参加的考试科目的列表,如下:

SELECT
    name AS `Name`,
    JSON_ARRAYAGG(subject) AS `Subjects`
FROM student_score
GROUP BY name;

输出:

+------+---------------------+
| Name | Subjects            |
+------+---------------------+
| Tim  | ["English"]         |
| Tom  | ["Math", "English"] |
+------+---------------------+

在本示例中,我们按照 name 分组。

我们知道了 Tom 参加了 Math 和 English 两门考试 ,而 Tim 只参加了 English 考试。

结论

在 MariaDB 中,JSON_ARRAYAGG() 是一个内置函数,它将指定的列或者表达式的值聚合为一个 JSON 数组。