concat、concat_ws()、group_concat()

本文探讨了MySQL中concat()、concat_ws()函数的区别,concat()遇到NULL会返回NULL,而concat_ws()不因NULL而变。同时介绍了group_concat()在分组聚合中的作用,包括去重和排序。适合理解字符串连接函数在实际项目中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

concat() 与 concat_ws() 函数用于连接两个或多个串,但它们之间的基本区别是:

1、CONCAT_WS()函数可以执行级联与串之间的分离器沿,而在CONCAT()方法没有隔板的概念。2、它们之间的另一个重要区别是,CONCAT()如果任何参数为NULL,则函数返回NULL;而CONCAT_WS()函数 分隔符为NULL时,函数将返回才NULL。

1、concat()函数

功能:将多个字符串连接成一个字符串。

语法:concat(str1,str2,...)

MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL,可以连接一个或者多个字符串。

select concat('10'); -- 10
 
select concat('11','22','33'); -- 112233

select concat('11','22',null); -- null

Oracle的concat函数连接的时候,只要有一个字符串不是NULL,就不会返回NULL。只能连接两个字符串,不能多也不能少。

select concat('11',NULL) from dual; -- 11

2、concat_ws() 函数

表示concat with separator,即有分隔符的字符串连接。

功能:和concat()一样,将多个字符串连接成一个字符串,但可以指定分隔符。

语法:concat_ws(separator, str1, str2, ...)

注意:

        和concat不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL;但会因为 分隔符为NULL,函数返回NULL。

select concat_ws(',','11','22','33'); -- 11,22,33
 
select concat_ws('|','11','22','33'); -- 11|22|33
 
select concat_ws('*','11','22',NULL); -- 11*22

select concat_ws(null,'11','22',NULL); -- null

 3、group_concat()函数

详细说明:mysql group_concat 函数

group by 查询语句中,select 指定的查询字段,只能是 group by 语句的后面的字段,或包含在聚合函数中。

功能 :将group by 产生的同一个分组中的值连接起来,返回一个字符串结果(但返回的结果有长度限制)。

语法:group concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc] [separator 分隔符] )

说明:

        通过使用distinct 可以排除重复值;

        如果希望结果中的只进行排序,可以使用 order by 子句;

        separator 是一个字符串值,缺省值为 一个逗号。

示例:

SELECT
	u.org_id 机构号,
	u.user_id 用户号,
	GROUP_CONCAT( r.role_ID ) 角色编号1, -- 默认使用逗号分隔
    GROUP_CONCAT( r.role_ID separator '#') 角色编号2,-- 指定分隔符 #
    GROUP_CONCAT( r.role_ID order by r.role_ID separator '#' ) 角色编号3, -- 根据角色编号排序,不去重
	GROUP_CONCAT( distinct r.role_ID order by r.role_ID separator '#' ) 角色编号4, -- 根据角色编号排序,并去重
    GROUP_CONCAT( r.role_name ) 角色名称1, 
	GROUP_CONCAT( distinct r.role_name order by r.role_ID) 角色名称2  -- 根据角色编号排序,拼接角色名称,并去重
FROM
	user AS u
	LEFT JOIN user_role_rel AS urr on u.user_id = urr.user_id 
	LEFT JOIN role AS r on urr.role_id = r.role_id
GROUP BY
	u.org_id,
	u.user_id

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值