2013-09-29 3 views
19

У меня есть столбец с переменным числом запятыми значений:SQL раскол разделенные запятой строки

somethingA,somethingB,somethingC 
somethingElseA, somethingElseB 

И я хочу, чтобы результат принимать каждое значение, и создать строку:

somethingA 
somethingB 
somethingC 
somethingElseA 
somethingElseB 

Как это сделать в SQL (MySQL)?

(я пытался прибегая к помощи «взрываются» и «вид сбоку», но те, похоже, не оказаться связанные вопросы. Все связанные SO вопросы пытаются сделать гораздо более сложные вещи)

+0

задал Gazillion раз на SO: eghttp: //stackoverflow.com/questions/10581772/sql-server-2008-how-to-split-a-comma-separated-value-to-columns , http://stackoverflow.com/questions/13873701/convert-comma-separated-column-value-to-rows –

+1

@MitchWheat - это не ответ на этот вопрос. У них есть определенное количество значений, разделенных запятыми, я этого не делаю. –

+0

Вы ищете чистое SQL-решение или решение на каком-то другом языке, например PHP. –

ответ

59

You может сделать это с чистым SQL, как этого

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value 
    FROM table1 t CROSS JOIN 
(
    SELECT a.N + b.N * 10 + 1 n 
    FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
    ORDER BY n 
) n 
WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) 
ORDER BY value 

Примечание: хитрость заключается в том, чтобы использовать таблицу индикаторных (номера) и очень удобный в этом случае функции MySQL SUBSTRING_INDEX(). Если вы выполняете много таких запросов (расщепление), вы можете подумать о том, чтобы заполнить и использовать сохраненную таблицу таблиц вместо генерации на лету с подзапросом, как в этом примере. Подзапрос в этом примере генерирует последовательность чисел от 1 до 100, эффективно позволяя вам разделить до 100 значений с разделителями на строку в исходной таблице. Если вам нужно больше или меньше, вы можете легко его отрегулировать.

Выход:

 
|   VALUE | 
|----------------| 
|  somethingA | 
|  somethingB | 
|  somethingC | 
| somethingElseA | 
| somethingElseB | 

Вот SQLFiddle демо


Это как запрос может выглядеть с сохраняемым столом учетного

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value 
    FROM table1 t CROSS JOIN tally n 
WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) 
ORDER BY value 

Вот SQLFiddle демо

+1

Genius решение. Спасибо. – bharatesh

+0

Отличный ответ, отлично работал, чтобы вставить идентификаторы друзей в таблицу отношений пользователя (на основе столбца, содержащего friendid1, friendid2). –

+0

Работает. Совет. Замените 'table1 -> [your table]', 'values ​​-> ваше имя поля', 'value -> ваше имя поля', больше ничего не требуется. –

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