2013-09-29 15 views
19

Ho una colonna con un numero variabile di virgola separati valori:SQL spaccatura separate da virgole fila

somethingA,somethingB,somethingC 
somethingElseA, somethingElseB 

E voglio il risultato di prendere ogni valore, e creare una riga:

somethingA 
somethingB 
somethingC 
somethingElseA 
somethingElseB 

Come posso farlo in SQL (MySQL)?

(ho provato googling "implodono" e "vista laterale", ma quelli non sembrano alzare questioni connesse. Tutti i relativi SO domande stanno cercando di fare le cose molto più complicate)

+0

ha chiesto un paio di volte gazillion su 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 - questa non è una risposta per questa domanda. Hanno un numero fisso di valori separati da virgola, io no. –

+0

Stai cercando una soluzione SQL pura o una soluzione in qualche altra lingua, ad esempio PHP. –

risposta

59

È può farlo con puro SQL come questo

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 

Nota: Il trucco è quello di sfruttare tally (numeri) tavolo e un molto utile in questa funzione MySQL SUBSTRING_INDEX() caso. Se si eseguono molte query di questo tipo (suddivisione), è possibile considerare di popolare e utilizzare una tabella di conteggio persistente invece di generarla su una sottoquery come in questo esempio. La sottoquery in questo esempio genera una sequenza di numeri da 1 a 100 che consente effettivamente di dividere fino a 100 valori delimitati per riga nella tabella di origine. Se hai bisogno di più o meno puoi facilmente regolarlo.

uscita:

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

Ecco SQLFiddle demo


Questo è come la query potrebbe apparire con una tabella conteggio persistente

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 

Ecco SQLFiddle demo

+1

Soluzione geniale. Grazie. – bharatesh

+0

Ottima risposta, ha funzionato perfettamente per inserire gli ID amici in una tabella delle relazioni utente (in base alla colonna contenente friendid1, friendid2) –

+0

Works. Suggerimento: sostituisci 'table1 -> [tua tabella]', 'valori -> nome del tuo campo',' valore -> nome del tuo campo', nient'altro è richiesto. –

Problemi correlati