#GROUP_CONCAT
GROUP_CONCAT函数在CONCAT函数的功能上增加了聚集功能,即对GROUP BY聚集的每个分组里的多行执行CONCAT操作。
函数返回值是CLOB类型。
string须为字符型,或可转换为字符型的其他类型,但不允许为JSON、NVARCHAR、NCHAR和NCLOB类型。
当string为NULL时,函数返回NULL。
DISTINCT
过滤在同一组内出现的相同string。
string
string参数可以为:
- expr
- 查询列为单列且返回行为单行的子查询
order_by_clause
对组内要CONCAT的string排序,其语法与SELECT语句中描述一致。
当ORDER BY后指定的是常量数字时,表示的是string的顺序值。
SEPARATOR sep_character
指定将组内的多行进行CONCAT时,多行之间加上sep_character定义的分隔符,sep_character只能为character类的常量或NULL。
此语句不指定时,默认为','。
示例
--创建exprs表,并插入数据
CREATE TABLE exprs (expra INT,exprb CHAR(3));
INSERT INTO exprs VALUES(1, 'aaa');
INSERT INTO exprs VALUES(1, 'bbb');
INSERT INTO exprs VALUES(2, 'bbb');
INSERT INTO exprs VALUES(2, 'ccc');
INSERT INTO exprs VALUES(3, 'ccc');
INSERT INTO exprs VALUES(3, 'ddd');
COMMIT;
--未指定GROUP BY时,将所有行CONCAT,得到一行结果
SELECT GROUP_CONCAT(expra,exprb) res FROM exprs;
RES
----------------------------------------------------------------
1aaa,1bbb,2bbb,2ccc,3ccc,3ddd
--group by后各组的多行数据分别CONCAT成一行,得到按组的多行结果
SELECT expra, GROUP_CONCAT(expra,exprb ORDER BY 2 SEPARATOR '$') res
FROM exprs
GROUP BY expra;
EXPRA RES
------------ ----------------------------------------------------------------
1 1aaa$1bbb
2 2bbb$2ccc
3 3ccc$3ddd
--子查询
SELECT expra,GROUP_CONCAT((SELECT expra FROM exprs WHERE ROWNUM=1),exprb ORDER BY 2 SEPARATOR '$') res
FROM exprs
GROUP BY expra;
EXPRA RES
------------ ----------------------------------------------------------------
1 1aaa$1bbb
2 1bbb$1ccc
3 1ccc$1ddd