sql >> Database teknologi >  >> RDS >> Mysql

SQL opdelt kommasepareret række

Du kan gøre det med ren SQL som denne

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

Bemærk: Tricket er at udnytte tally(tal)-tabellen og en meget praktisk i dette tilfælde MySQL-funktion SUBSTRING_INDEX() . Hvis du laver mange sådanne forespørgsler (opsplitning), kan du overveje at udfylde og bruge en vedvarende tally-tabel i stedet for at generere den på fly med en underforespørgsel som i dette eksempel. Underforespørgslen i dette eksempel genererer en sekvens af tal fra 1 til 100, hvilket effektivt giver dig mulighed for at dele op til 100 afgrænsede værdier pr. række i kildetabellen. Hvis du har brug for mere eller mindre, kan du nemt justere det.

Output:

| VÆRDI ||----------------|| nogetA || nogetB || nogetC || noget andetA || noget andetB |

Her er SQLFiddle demo

Sådan kan forespørgslen se ud med en vedvarende optællingstabel

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

Her er SQLFiddle demo




  1. Migrering af MySQL til PostgreSQL på AWS RDS, del 4

  2. 5 tips og tricks til at hjælpe dig med at administrere din onlinedatabase

  3. Fix Msg 241 "Konvertering mislykkedes ved konvertering af dato og/eller tid fra tegnstreng" i SQL Server

  4. Er PL/SQL-variabler i markører effektivt det samme som bindeparametre?