2013-09-29 20 views
19

Mam kolumny o zmiennej liczbie przecinkami oddzielone wartości:SQL podzielonego oddzielonych przecinkami wiersz

somethingA,somethingB,somethingC 
somethingElseA, somethingElseB 

I chcę wynik podjąć każdą wartość i utworzyć rząd:

somethingA 
somethingB 
somethingC 
somethingElseA 
somethingElseB 

Jak mogę to zrobić w SQL (MySQL)?

(Próbowałem googlowania „implode” i „Widok boczny”, ale te wydają się nie pojawić się pytania związane. Wszystkich powiązanych SO pytania staramy się robić bardziej skomplikowane rzeczy)

+0

zapytał gazillion razy na 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 - to nie jest odpowiedź na to pytanie. Mają ustawioną liczbę wartości oddzielonych przecinkami, ja nie. –

+0

Szukasz rozwiązania czystego SQL lub rozwiązania w innym języku - na przykład PHP. –

Odpowiedz

59

You można to zrobić z czystym SQL jak ten

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 

Uwaga: Sztuką jest wykorzystanie sygnalizacyjną (numery) stolik i bardzo przydatny w tym przypadku funkcja MySQL SUBSTRING_INDEX(). Jeśli wykonujesz wiele takich zapytań (dzielenie), możesz rozważyć wypełnienie i użycie tabeli utrzymywanych tabel, zamiast generowania jej w locie z podzapytaniem podobnym do tego w tym przykładzie. Podzapytanie w tym przykładzie generuje sekwencję liczb od 1 do 100, umożliwiając efektywne rozdzielenie do 100 oddzielnych wartości w wierszu tabeli źródłowej. Jeśli potrzebujesz więcej lub mniej, możesz łatwo to zmienić.

wyjściowa:

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

Oto SQLFiddle demo


ten sposób kwerenda może wyglądać z utrwalonej tabeli tally

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 

Oto SQLFiddle demo

+1

Rozwiązanie Genius. Dziękuję Ci. – bharatesh

+0

Świetna odpowiedź, działa idealnie, aby wstawić identyfikatory przyjaciół do tabeli relacji użytkownika (w oparciu o kolumnę zawierającą friendid1, friendid2) –

+0

Działa. Wskazówka: Zamień 'table1 -> [twoja tabela]', 'values ​​-> twoja nazwa pola',' value -> twoja nazwa pola', nic więcej nie jest wymagane. –

Powiązane problemy