相关推荐recommended
SQL多行值合并一行字符串逗号分隔(LISTAGG )
作者:mmseoamin日期:2023-12-14

问题:

假设我们有一张学生表:姓名,科目,成绩。

在查询的SQL使用中我们可能会有这样一种需求:展示学生姓名和科目成绩,科目成绩用逗号分隔。

实际上也就是将这个学生的所有成绩记录转换为一条记录展示出来。

就可以使用这个SQL:

SELECT 姓名, LISTAGG(成绩, ',') WITHIN GROUP (ORDER BY 科目) AS 科目成绩
FROM 学生表
GROUP BY 姓名;

这个查询首先选择了 “姓名” 字段,然后使用 LISTAGG函数将相同学生的 “成绩” 字段值以逗号分隔的形式合并成一个字符串,并按照 “科目” 字段的顺序进行排序。

LISTAGG 

LISTAGG 是一个用于聚合操作的字符串函数,它在Oracle数据库系统中可用,当然达梦也可以。该函数用于将多个行中的值连接为一个字符串,并且可以指定分隔符来分隔每个值。

通常语法如下:

LISTAGG(expression, delimiter) WITHIN GROUP (ORDER BY column)
  • expression 是要连接的列或表达式。
  • delimiter 是用于分隔每个值的字符串。
  • WITHIN GROUP 子句用于指定对结果进行排序的列。可以选择省略此子句。
  • ORDER BY 子句用于指定排序的顺序。

    LISTAGG 函数将具有相同分组键的行的值连接起来,并使用指定的分隔符将它们分隔开。这非常适用于将多个值合并为一个字符串,常用于生成逗号分隔的列表。

    实例:

    SQL多行值合并一行字符串逗号分隔(LISTAGG ),第1张

    如图我们看到这个查询结果中parti_name字段有多个数据,现在我们把它转换为一条记录查询出来且用逗号隔开。

    SELECT uuid as uuid, LISTAGG(parti_name, ',') WITHIN GROUP ( ORDER BY DISPLAYORDER) AS parti_name
    		FROM PARTICIPA 
     GROUP BY uuid 

    结果:

    SQL多行值合并一行字符串逗号分隔(LISTAGG ),第2张

    注意:

    LISTAGG 聚合函数是 Oracle 数据库中的特定函数,用于将多个行的值进行连接。

    因此,LISTAGG 函数可以在 Oracle 数据库中使用,并且从 Oracle 11g 版本开始可用。

    在其他数据库系统中,可能会有类似的函数用于字符串聚合操作,但具体的函数名称、语法和用法可能会有所不同。如下是一些其他数据库系统中类似 LISTAGG 的函数,有类似需求可百度求解:

    1. MySQL:GROUP_CONCAT
    2. SQL Server:STRING_AGG
    3. PostgreSQL:STRING_AGG
    4. IBM DB2:LISTAGG