关键字:
KingbaseES、GROUP_CONCAT、人大金仓
语法
GROUP_CONCAT函数将指定表达式的结果集中的非空字符连接成一个字 符串并返回。
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY order_expr [ASC | DESC] [,order_expr...]] [SEPARATOR str_val])
规则
(1)expr:任意数量字段或表达式,order_expr:任意排序字段或表达式,str_val:任意非空的可见字符或字符串。取值字段支持多个,expr表示任意表达式,分隔符为字符串,先把每行的多个表达式转换成字符串拼接后再用指定的分隔字符串拼接;比如第一个expr为1,第二个expr为2,分隔符指定为“-”,则拼接后的值为“1-2”;
(2)分隔字符串是任意非空的可见字符或字符串,对应text类型,最大长度 1073741820,默认是逗号。
(2)返回值类型为text。当表达式结果类型为 bytea 时,返回的包含二进制字符串的串联值,数据类型为text。暂不支持用户自定义设置返回结果的最大长度。函数返回值长度最大支持 1073741820。 当返回值完整长度大于设置的最大长度时,结果将被截断。
(4)多个取值字段受函数最大支持参数个数限制,为512。
(5)在sql_mode不包含ONLY_FULL_GROUP_BY的情况下,order by字段支持多个,依次按指定字段排序后再进行拼接,并且可以和distinct后面取值字段不一致。
数据准备
(1)创建数据表并插入数据
test=# create table student (sname varchar(10), score int, course bytea);
CREATE TABLE
test=# insert into student values('liming', 23, 'a'),('liming', 45, 'b'),('liming', 67, 'c'),('liming', 67, 'd');
INSERT 0 4
test=# insert into student values('zhangsan', 78, 'a'),('zhangsan', 44, 'b'),('zhangsan', 33, 'c');
INSERT 0 3
(2)查看数据表
test=# select * from student;
sname | score | course
----------+-------+--------
liming | 23 | \x61
liming | 45 | \x62
liming | 67 | \x63
liming | 67 | \x64
zhangsan | 78 | \x61
zhangsan | 44 | \x62
zhangsan | 33 | \x63
(7 rows)
测试用例
(1)不加分隔符的GROUP_CONCAT函数,默认为逗号。
test=# SELECT sname, GROUP_CONCAT(score) FROM student GROUP BY sname;
sname | group_concat
----------+--------------
zhangsan | 78,44,33
liming | 23,45,67,67
(2 rows)
(2)加空分隔符的GROUP_CONCAT函数。
test=# SELECT sname, GROUP_CONCAT(score SEPARATOR '') as scores FROM student GROUP BY sname;
sname | scores
----------+----------
zhangsan | 784433
liming | 23456767
(2 rows)
(3)带DISTINCT的GROUP_CONCAT函数,无重复值
test=# SELECT sname, GROUP_CONCAT(DISTINCT score) as scores FROM student GROUP BY sname;
sname | scores
----------+----------
liming | 23,45,67
zhangsan | 33,44,78
(2 rows)
(4)带DISTINCT和ORDER BY的GROUP_CONCAT函数,按照score列排序并去重。
test=# SELECT sname, GROUP_CONCAT(DISTINCT score ORDER BY score desc) as scores FROM student GROUP BY sname;
sname | scores
----------+----------
liming | 67,45,23
zhangsan | 78,44,33
(2 rows)
(5)带多列ORDER BY的GROUP_CONCAT函数,按照score列先后排序并输出连接结果。
test=# SELECT GROUP_CONCAT(score ORDER BY score, sname) as scores FROM student;
scores
----------------------
23,33,44,45,67,67,78
(1 row)
(6)以aaa为分隔符,按照sname列分组的GROUP_CONCAT函数。
test=# SELECT sname, GROUP_CONCAT(score SEPARATOR 'aaa') as scores FROM student GROUP BY sname;
sname | scores
----------+-------------------
zhangsan | 78aaa44aaa33
liming | 23aaa45aaa67aaa67
(2 rows)
(6)GROUP_CONCAT函数不支持DISTINCT和ORDER BY列不一样。
test=# SELECT sname, GROUP_CONCAT(DISTINCT score ORDER BY sname asc, score desc) as scores FROM student GROUP BY sname;
ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list
LINE 1: ...ELECT sname, GROUP_CONCAT(DISTINCT score ORDER BY sname asc,...