问题:
假设我们有一张学生表:姓名,科目,成绩。
在查询的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
函数将具有相同分组键的行的值连接起来,并使用指定的分隔符将它们分隔开。这非常适用于将多个值合并为一个字符串,常用于生成逗号分隔的列表。
实例:
如图我们看到这个查询结果中parti_name字段有多个数据,现在我们把它转换为一条记录查询出来且用逗号隔开。
SELECT uuid as uuid, LISTAGG(parti_name, ',') WITHIN GROUP ( ORDER BY DISPLAYORDER) AS parti_name
FROM PARTICIPA
GROUP BY uuid
结果:
注意:
LISTAGG
聚合函数是 Oracle 数据库中的特定函数,用于将多个行的值进行连接。因此,
LISTAGG
函数可以在 Oracle 数据库中使用,并且从 Oracle 11g 版本开始可用。
在其他数据库系统中,可能会有类似的函数用于字符串聚合操作,但具体的函数名称、语法和用法可能会有所不同。如下是一些其他数据库系统中类似 LISTAGG
的函数,有类似需求可百度求解:
- MySQL:
GROUP_CONCAT
- SQL Server:
STRING_AGG
- PostgreSQL:
STRING_AGG
- IBM DB2:
LISTAGG