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()函数
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