Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL dzielony wiersz oddzielony przecinkami

Możesz to zrobić za pomocą czystego SQL w ten sposób

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: Sztuczka polega na wykorzystaniu tabeli tally(numbers) i bardzo przydatnej w tym przypadku funkcji MySQL SUBSTRING_INDEX() . Jeśli wykonujesz wiele takich zapytań (podział), możesz rozważyć wypełnienie i użycie utrwalonej tabeli zestawień zamiast generowania jej w locie za pomocą podzapytania, jak w tym przykładzie. Podzapytanie w tym przykładzie generuje sekwencję liczb od 1 do 100, co pozwala efektywnie podzielić do 100 wartości rozdzielanych na wiersz w tabeli źródłowej. Jeśli potrzebujesz więcej lub mniej, możesz to łatwo dostosować.

Wyjście:

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

Oto SQLFiddle demo

Tak może wyglądać zapytanie z utrwaloną tabelą zestawień

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zresetuj hasło root serwera MySQL

  2. PHP i MySQL:mysqli_num_rows() oczekuje, że parametr 1 to mysqli_result, podana wartość logiczna

  3. Odmowa dostępu dla użytkownika „[chroniony adres e-mail]” (przy użyciu hasła:NIE)

  4. INTERSECT w MySQL

  5. Zachowanie GROUP BY, gdy w klauzuli SELECT nie ma funkcji agregujących