一、前言
最近项目上遇到一个情况,一个地市有多个县区分公司,一个分公司下面又有好多具体的支局,需要通过区县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 函数进行转换。