• 【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
    

    完美解决问题

  • 相关阅读:
    HIVE的基本操作
    sqoop数据迁移
    工作流调度器azkaban
    C/s模式与B/S模式
    自动装箱和拆箱所带来的问题(1)“==”问题
    线程死锁
    模拟售票
    线程之间的通信
    线程同步引发的安全问题
    sql server 与 mysql在自定以数据类型的区别
  • 原文地址:https://www.cnblogs.com/guanhuohuo/p/12533583.html
Copyright © 2020-2023  润新知