Oracle数据库把多行转一列逗号分割的方法

2024-11-21 1

在Oracle数据库中,有时候我们需要将多行数据转换为一列,并用逗号进行分割。这种操作通常用于将多个值合并成一个字符串,以便于在程序中进行处理或显示。本文将详细介绍如何在Oracle数据库中实现这种操作。

方法一:使用WM_CONCAT函数

在Oracle数据库中,可以使用WM_CONCAT函数来实现将多行合并为一列并用逗号分割的功能。WM_CONCAT函数可以将多行的值合并成一个字符串,并用指定的分隔符进行分割。

下面是一个示例,假设我们有一个表students,包含学生的姓名和所在班级:

1
2
3
4
5
6
7
8
9
CREATE TABLE students (
    student_name VARCHAR2(50),
    class VARCHAR2(50)
);
 
INSERT INTO students VALUES('Alice', 'Class 1');
INSERT INTO students VALUES('Bob', 'Class 2');
INSERT INTO students VALUES('Cathy', 'Class 1');
INSERT INTO students VALUES('David', 'Class 2');

现在我们要将学生的姓名合并成一列,并用逗号分割,可以使用如下SQL语句:

1
2
3
SELECT class, WM_CONCAT(student_name) AS students
FROM students
GROUP BY class;

上面的SQL语句将会得到以下结果:

1
2
3
4
|   CLASS   |        STUDENTS       |
|-----------|-----------------------|
|  Class 1  |  Alice,Cathy          |
|  Class 2  |  Bob,David            |

方法二:使用LISTAGG函数

除了WM_CONCAT函数外,Oracle数据库还提供了LISTAGG函数来实现将多行合并为一列并用指定的分割符进行分割的功能。LISTAGG函数的语法如下:

1
LISTAGG (expr, delimiter) WITHIN GROUP (ORDER BY expr)

其中expr表示要合并的列,delimiter表示分隔符。同样,我们可以使用LISTAGG函数来实现上面相同的功能。

1
2
3
SELECT class, LISTAGG(student_name, ',') WITHIN GROUP (ORDER BY student_name) AS students
FROM students
GROUP BY class;

运行上面的SQL语句可以得到与前文相同的结果:

1
2
3
4
|   CLASS   |        STUDENTS       |
|-----------|-----------------------|
|  Class 1  |  Alice,Cathy          |
|  Class 2  |  Bob,David            |