当前位置: 代码迷 >> 综合 >> concat、concat_ws、group_concat
  详细解决方案

concat、concat_ws、group_concat

热度:44   发布时间:2023-12-17 23:35:18.0

一、concat()函数
1、功能:将多个字符串连接成一个字符串。
2、语法:concat(str1, str2,…)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
select CONCAT(‘a’,‘b’) from dual; – ab
select CONCAT(‘a’,NULL) from dual; – null
select CONCAT(‘a’,’,’,‘b’) from dual; – a,b

二、concat_ws()函数
1、功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~
2、语法:concat_ws(separator, str1, str2, …)
说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。
select CONCAT_WS(’,’,‘a’,‘b’) from dual; – a,b
select CONCAT_WS(null,‘a’,‘b’) from dual; – null

三、group_concat()函数
1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )
说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号。

在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中。
select name min(age) from student GROUP BY name;
name age
小明 3
小明 2
张三 11
张三 6

查询了name相同的的人中最小的年龄。如果我们要查询name相同的人的所有的年龄呢?
select name GROUP_CONCAT(age) form student GROUP BY name;
name age
小明 3,2
张三 11,6

将上面的年龄从大到小排序,且用’_'作为分隔符:
select name group_concat(age order by asc separator ‘-’) from student group by name;

查询以name分组的所有组的年龄和score,并对年龄和score相同的数据去重:
select name group_concat(distinct concat_ws(’,’,age,score) order by age asc) from student group by name;

  相关解决方案