sql >> Base de Datos >  >> RDS >> Mysql

SQL divide filas separadas por comas

Puedes hacerlo con SQL puro como este

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: El truco es aprovechar la tabla de conteo (números) y una función MySQL muy útil en este caso SUBSTRING_INDEX() . Si realiza muchas de estas consultas (dividir), entonces podría considerar completar y usar una tabla de conteo persistente en lugar de generarla sobre la marcha con una subconsulta como en este ejemplo. La subconsulta de este ejemplo genera una secuencia de números del 1 al 100, lo que le permite dividir hasta 100 valores delimitados por fila en la tabla de origen. Si necesitas más o menos, puedes ajustarlo fácilmente.

Salida:

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

Aquí está SQLFiddle demostración

Así es como se vería la consulta con una tabla de conteo 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

Aquí está SQLFiddle demostración