2013-06-27 2 views
3

У меня есть SQL-запрос, как это: -Различного разделителя в группе CONCAT

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 

мне нужно другое разделитель так, разделитель по умолчанию группы 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

Пожалуйста, помогите исправить синтаксис sql группы concat с помощью другого разделителя.

+0

Не думаю, запятая перед тем требуется сепараторе. – Kickstart

ответ

3

не использовать запятую перед тем СЕПАРАТОРА

первый вы не включая separator внутри group_concat функции.

второй вы ничего не делаете с заменой функции

Take a look here

EDIT:

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

все еще показывает ошибку – Monisha

+1

любой другой тип concat метода? – Monisha

+0

SEPARATOR в этом фрагменте кода находится в REPLACE, а не в GROUP_CONCAT (не выполняется какая-либо замена) – Kickstart

0

ответ Самира давал больше дефиса в результате. Я немного изменил запрос и получил точный результат.

запрос Самира: -

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 ,,, заменен пробелом '', так что повторяющийся символ не придет.

Спасибо, Самир.

+0

. Я просто угадываю, почему вы получаете много ... это потому, что у вас есть пустые ценности, и он связан со сператором - так вот почему у вас много -------------, это значит у вас есть поля пустые поля concat пустые ..... так что я думаю, вы должны дать и условие, чтобы не выбирать пустые значения –

0

Не уверен, что вам нужно ЗАМЕНИТЬ.

GROUP_CONCAT должен игнорировать поля 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 .....