一、前言

最近项目上遇到一个情况,一个地市有多个县区分公司,一个分公司下面又有好多具体的支局,需要通过区县ID或者名字对应的多条支局拼接成一个字符串放在一个字段里,于是网上查到了group_concat方法,我们来看一下具体的执行效果。同时也详细学习了concat()、concat_ws()函数。

二、concat()

2.1 功能

将多个字符串连接成一个字符串。

2.2 语法

concat(str1, str2,...)

返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

2.3 实例

1
select CONCAT(t.orgname, '(', t.orgid, ') - ', t.orgcode) dsc ,t.* from entry_pianquzb_report t where t.latn = 20001

三、concat_ws()

3.1 功能

和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)

3.2 语法

concat_ws(separator, str1, str2, ...)

第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

3.3 实例

1
select CONCAT_WS(' - ',t.orgname, t.orgcode) dsc ,t.* from entry_pianquzb_report t where t.latn = 20001

四、group_concat()

4.1 功能

GROUP_CONCAT 函数返回带有来自一个组的连接的非 NULL 值的字符串结果。该函数是一个增强的 Sybase SQL Anywhere 支持的基本 LIST() 函数。

4.2 语法

1
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])

DISTINCT:去除重复值
expr [,expr ...]:一个或多个字段(或表达式)
ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]:根据字段或表达式进行排序,可多个

4.3 实例

查询县局分公司的所有支局并用逗号连接

select t.fgsorgname,GROUP_CONCAT(t.zjorgname) zjname from entry_pianquzb_report t where t.latn = 20001 group by t.fgsorgname

查询县局分公司的所有支局并用分号连接

select t.fgsorgname,GROUP_CONCAT(t.zjorgname SEPARATOR ';') zjname from entry_pianquzb_report t where t.latn = 20001 group by t.fgsorgname

查询县局分公司的所有支局,用支局id排序后再连接

select t.fgsorgname,GROUP_CONCAT(t.zjorgname order by t.zjorgid) zjname from entry_pianquzb_report t where t.latn = 20001 group by t.fgsorgname

4.4 注意事项

最大长度(字符)限制:

系统变量:group_concat_max_len

SET [SESSION | GLOBAL] group_concat_max_len = val;

val 必须是无符号整数
用了GROUP_CONCAT函数,SELECT语句中的LIMIT语句起不了任何作用。

INT 类型陷阱

连接的字段为INT类型时,低版本或出现返回的结果不是逗号分隔的字符串,而是byte[]。此时,需要用 CAST 或 CONVERT 函数进行转换。