2016-06-27 4 views
1

У меня есть несколько полей в моей таблице, и я хочу, чтобы объединить некоторые из них в строку, используя - в качестве разделителя:Concat различных значений с разделителем

select 
    concat(
     case when a <> 'a' then concat('A = ', a) 
     case when b <> 'b' then concat(' - B = ', b) 
     ... 
     case when z <> 'z' then concat(' - Z = ', z) 
    ) 
; 

Теперь, если А не включен, то мой результат начнется с -, и я не хочу этого. В действительности у меня есть 15 случаев, поэтому я не могу просто проверить, есть ли A 1, чтобы вставить -. Какое самое простое решение, чтобы моя строка никогда не начиналась с разделителя?

Я знаю, что могу просто проверить, если он начинается с «-», но это выглядит как грязный раствор для меня ...

+0

Можете ли вы показать нам пример таблицы вместе с выходом вы хотите? –

+0

Предположим, у меня есть таблица с 26 полями (A -> Z). Все простые VARCHAR (10) Возможный выход: C = r - F = z - Y = q - Z = n Я понимаю, что мой пример плохо выбран, но это не должно иметь значения ... –

+0

Да, но что это данные и какой результат вы хотите? Мы не можем читать ваши мысли. –

ответ

4

Если я правильно понимаю ваш вопрос, вы должны попробовать что-то с concat_ws вроде следующего код (обычно concat_ws будет пропускать пустые значения из ваших утверждений CASE):

SELECT 
    CONCAT_WS(
     ' - ', 
     (CASE a WHEN 1 THEN CONCAT('A = ', a) ELSE null END), 
     (CASE b WHEN 1 THEN CONCAT('B = ', b) ELSE null END), 
     ... 
    ) 

Пример ниже

create table table5 
( id int auto_increment primary key, 
    a int not null, 
    b int not null 
); 
insert table5(a,b) values (0,0),(1,0),(1,1),(0,1),(1,1); 

SELECT 
    id, 
    CONCAT_WS( 
     ' - ', 
     (CASE a WHEN 1 THEN CONCAT('A = ', a) ELSE null END), 
     (CASE b WHEN 1 THEN CONCAT('B = ', b) ELSE null END) 
    ) as xxx 
    from table5; 
+----+---------------+ 
| id | xxx   | 
+----+---------------+ 
| 1 |    | 
| 2 | A = 1   | 
| 3 | A = 1 - B = 1 | 
| 4 | B = 1   | 
| 5 | A = 1 - B = 1 | 
+----+---------------+ 
+0

Это именно то, что я ищу. Благодаря! –

+0

Хороший ответ Микаэль – Drew

+0

Thx для примера :) –

Смежные вопросы