【mysql】concat及group_concat

在mysql中使用concat和group_concat查询,遇到一些坑,mark一下
首先看看concat和group_concat分别有什么作用

concat()函数

功能: 将多个字符串连接成一个字符串。
语法: concat(str1, str2,…)

实际栗子

SELECT * FROM iv WHERE concat(projec_name,projectid,name) LIKE '%swapi%'

可正确查询 projec_name, projectid, name字段信息,但是出现一个问题,列表中存在数据,但是查询出来的数据为空
定位发现当projec_name或name不存在时,查询的数据为null,为什么呢?

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

修改如下即可解决问题

SELECT * FROM iv WHERE concat(IFNULL(projec_name,''),projectid,IFNULL(name,'')) LIKE '%swapi%'

如果需要在多个拼接的字符串中间加上分隔符,可以增加逗号做为分隔符

SELECT * FROM iv WHERE concat(IFNULL(projec_name,''),'',projectid,'',IFNULL(name,'')) LIKE '%swapi%'

当然,如果想使用指定参数之间的分隔符可使用concat_ws()函数

concat_ws()函数

功能: 将多个字符串连接成一个字符串,但是可以一次性指定分隔符 concat with separator
语法: concat_ws(separator, str1, str2, …)
注:分隔符不能为null,如果为null,则返回结果为null

举个栗子

SELECT * FROM iv WHERE concat_ws(',',IFNULL(projec_name,''),projectid,IFNULL(name,'')) LIKE '%swapi%'

group_concat()函数

在实现业务过程中有一个这样的需求,需要看项目中该用例标签是否被使用,这个时候需要查询所有的用例中tag字段,判断需要查询的标签是否在已使用的tag中,group_concat可以满足这个需求

功能: 将group by产生的同一个分组中的值连接起来,返回一个字符串结果
语法: group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )

实际栗子

SELECT GROUP_CONCAT(tag) AS tag FROM tc WHERE project_id = 'swapi' AND  is_delete = 0

或使用group by

SELECT in_id,GROUP_CONCAT(tag) AS tag FROM tc WHERE project_id = 'swapi' GROUP BY in_id

也可以进行排序

SELECT in_id,GROUP_CONCAT(tag order by in_id DESC) AS tag FROM tc WHERE project_id = 'swapi' GROUP BY in_id

或者使用’_'进行拼接

SELECT in_id,GROUP_CONCAT(tag order by in_id DESC separator '_') AS tag FROM tc WHERE project_id = 'swapi' GROUP BY in_id

功能蛮强大的,但是在使用过程中发现有个项目查询已使用的tag信息一直报错,定位问题时发现原来查询出来的列表仅显示前面一部分,为什么呢?原来查询得到的字符串长度过长导致。那怎么处理该问题?
其实group_concat提供了一种方式,distinct可以排除重复值,将重复值排除后可完全获取到已使用的tag列表

SELECT in_id,GROUP_CONCAT(distinct tag order by in_id DESC separator '_') AS tag FROM tc WHERE project_id = 'swapi' GROUP BY in_id

完美解决问题

posted @ 2019-10-16 20:20  guanqinghua  阅读(89)  评论(0编辑  收藏  举报