组concat中的不同分隔符

时间:2013-06-27 10:24:44

标签: mysql replace delimiter group-concat

我有一个像这样的SQL查询: -

 REPLACE(
  GROUP_CONCAT( 
   IF( 
    (timediff(delta_ts,creation_ts) > '03:00:00')    
     && (priority='P5') ,bug_id,'')
     ),',,','' )
   AS exceeded_bugs
  from bugs
  ......

我得到的结果: -

exceeded_bugs: ,3743331,3743332,3743333

我需要不同的分隔符,因为Group concat的默认分隔符是“,”。我需要使用空格或“|”分隔错误或“ - ”符号。

我尝试过: -

 REPLACE(
  GROUP_CONCAT( 
   IF( 
    (timediff(delta_ts,creation_ts) > '05:00:00')    
    && (priority='P6') ,bug_id,'')
    ) 
    ,SEPARATOR '-' ) 
   AS exceeded_bugs 
  from bugs
  .....

我收到了错误: -

您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在'SEPARATOR' - '附近使用正确的语法,作为第1行的exceeded_bugs

请帮助使用不同的分隔符更正group concat的sql语法。

3 个答案:

答案 0 :(得分:3)

不要在SEPARATOR之前使用逗号

首先,您未在separator函数中包含group_concat

第二,你没有用替换功能做任何事情

Take a look here

编辑:

   REPLACE(GROUP_CONCAT( IF( (timediff(delta_ts,creation_ts) > '03:00:00') && (priority='P5') ,bug_id,'') SEPARATOR '-'),',,','' ) as exceeded_bugs

答案 1 :(得分:0)

萨米尔的回答是在结果中添加了更多的连字符。我略微修改了查询,得到了确切的结果。

Samir的询问: -

 select sum( 
    IF( (timediff(delta_ts,creation_ts) > '03:00:00') 
    && (priority='P5') ,1,0))   P5_time_exceeded,
    REPLACE(GROUP_CONCAT( IF( (timediff(delta_ts,creation_ts) > '03:00:00') 
    && (priority='P5') ,bug_id,'') SEPARATOR '-'),',,','' ) as exceeded_bugs 
    from bugs 
     ......

结果我得到了: -


P5_time_exceeded: 3                                                                                                                                  
exceeded_bugs: ---3743331-3743332-3743333--------------------------                                                                           
1 row in set (0.00 sec) 

修改后的查询

 select sum( 
   IF( (timediff(delta_ts,creation_ts) > '03:00:00') 
   && (priority='P5') ,1,0)) P5_time_exceeded,
   REPLACE(GROUP_CONCAT( IF( (timediff(delta_ts,creation_ts) > '03:00:00')
   && (priority='P5') ,bug_id,'') SEPARATOR '-'),'---','' ) 
   as exceeded_bugs 
   from bugs 
   where .....

得到了确切的结果: -

P5_time_exceeded: 3
   exceeded_bugs: 3743331-3743332-3743333

我正在替换重复sybmol的最小倍数,用空格''代替,这样,重复符号就不会出现。

谢谢Samir。

答案 2 :(得分:0)

不确定是否需要REPLACE。

GROUP_CONCAT应忽略NULL字段,但如果要忽略NULL字段,则会出现空出现。而不是使用''尝试使用NULL代替。

像这样: -

SELECT SUM( IF( (TIMEDIFF(delta_ts,creation_ts) > '03:00:00') && (priority='P5') ,1,0)) AS P5_time_exceeded,
GROUP_CONCAT( IF( (TIMEDIFF(delta_ts,creation_ts) > '03:00:00') && (priority='P5'), bug_id, NULL) SEPARATOR '-') AS exceeded_bugs 
FROM bugs 
WHERE .....