人大金仓数据库KingbaseES-GROUP_CONCAT函数用法

关键字:

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,...

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值