Многократная конкатенация MySQL с разными разделителями - CONCAT_WS - PullRequest
0 голосов
/ 06 февраля 2012

Я динамически создаю конкатенацию MySQL с несколькими полями и разными разделителями.Я хотел бы удалить разделитель, если текущее объединенное поле пустое или пустое.

$concat_string = "CONCAT_WS('".$infix_array[0]."'," . $concat_fields_array[0] . "," . $concat_fields_array[1] . ")";
$i = 0;
foreach($concat_fields_array as $concat_field){
    if($i >= 2){
         $concat_string = "CONCAT_WS('".$infix_array[$i-1]."'," . $concat_string . "," . $concat_field . ")";
    }
    $i++;
}

Это создает вложенный CONCAT_WS, например:

 CONCAT_WS(', ',CONCAT_WS(' - ',CONCAT_WS(':',CONCAT_WS(' ',field1,field2),field3),field4),field5)

Будет ли перенос полей в NULLIF, например, NULLIF (field1, ''), избавляться от лишних инфиксов?

Есть ли более быстрая функция для этого?

1 Ответ

0 голосов
/ 07 февраля 2012

У вас нет проблем с полями NULL, потому что CONCAT_WS пропустит значения NULL (вместе с разделителем). Что касается пустых строк (которые не будут пропущены), вы можете просто превратить их в NULL, прежде чем делать это. Если вы не можете обновить саму базу данных, сделайте запрос вроде:

select <your expression> from (select case when col1 = '' then null else col1 end as col1 from my_table);

так, просто конвертируйте его в null на лету и сделайте свой выбор из этого внутреннего запроса.

Чтобы сделать это, вам нужно будет использовать nullif, поэтому вместо:

CONCAT_WS(a, CONCAT_WS(c, d))

использовать

NULLIF(CONCAT_WS(a, NULLIF(CONCAT_WS(c, d), '')), '')

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

...