在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
完美解决问题