SQL split comma separated row

Ho una colonna con un numero variabile di valori separati da virgole:

somethingA,somethingB,somethingC somethingElseA, somethingElseB 

E voglio che il risultato prenda ogni valore e crei una riga:

 somethingA somethingB somethingC somethingElseA somethingElseB 

Come posso farlo in SQL (MySQL)?

(Ho provato a cercare su google “implode” e “vista laterale”, ma a quanto pare non vengono visualizzate domande correlate. Tutte le domande SO correlate stanno cercando di fare cose molto più complicate)

Puoi farlo con SQL puro come questo

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', nn), ',', -1) value FROM table1 t CROSS JOIN ( SELECT aN + bN * 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 nn <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', ''))) ORDER BY value 

Nota: il trucco è sfruttare la tabella tally (numeri) e molto utile in questo caso la funzione MySQL SUBSTRING_INDEX() . Se si eseguono molte query di questo tipo (suddivisione), è ansible 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.

Produzione:

 |  VALORE |
 | ---------------- |
 |  qualcosaA |
 |  qualcosaB |
 |  qualcosaC |
 |  qualcosaElseA |
 |  qualcosa di ALTRO |

Ecco la demo di SQLFiddle


Ecco come potrebbe apparire la query con una tabella di conteggio persistente

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

Ecco la demo di SQLFiddle