2012-06-27 4 views
0

У меня есть таблица MySQL со структурой, подобными следующим:MySQL конкатенации на основе содержимого поля

MySQL fields

Я ищу отборное заявление, которое объединит последние четыре полей следующим образом:

ID Source 
1  Search engine 
2  Email 
3  Coupon mailout 
4  Relative of owner 

Я могу придумать способ сделать это с помощью подзапросов, чтобы выбрать соответствующие поля для конкатенации на основе типа, вложенные подзапросы, чтобы выбрать значения, которые не NULL или «Other», а затем швов, CONCAT() s и UNION, но это кажется очень сложный подход к проблеме.

Я переусердствовал это? Есть ли более простой способ?

ответ

1

Если вы не можете исправить свои данные, вы можете просто использовать функцию IF(). В моем примере я использую простые имена столбцов, чтобы сделать его более понятным:

mysql> SELECT IF(c1 IS NOT NULL AND c1 != 'Other', c1, 
     IF(c2 IS NOT NULL AND c2 != 'Other', c2, 
     IF(c3 IS NOT NULL AND c3 != 'Other', c3, c4))) FROM t1; 

Вышеупомянутый был протестирован.

Вы можете сделать из него сохраненную функцию, если вам нужно использовать ее часто.

Но, если можете, исправьте структуру таблицы?

+0

Спасибо! Я хотел бы исправить структуру, но, к сожалению, я застрял на ней. – patabongo

0

Я думаю, вам нужно несколько IF с и IFNULL с в там, что-то вроде:

SELECT ID, IF(Type='Online', IFNULL(OnlineSourceOther, OnlineSource), IFNULL(OfflineSourceOther, OfflineSource)) AS Source FROM referrals 

Полностью тестировался, YMMV, удачи, дайте нам знать, как она идет.

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