sql >> Databasteknik >  >> RDS >> Mysql

Dela upp (explodera) kommaavgränsade kolumnvärden till rader

UPPDATERAD Du kan göra det med SQL så här

INSERT INTO branch_table (id, branch_id)
SELECT e.id, SUBSTRING_INDEX(SUBSTRING_INDEX(e.branch_ids, ',', n.n), ',', -1) branch_id
  FROM eligibility_table e 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(e.branch_ids) - LENGTH(REPLACE(e.branch_ids, ',', '')))
 ORDER BY id, branch_id
  • Underfrågan med alias n genererar i farten en sekvens av tal (siffror eller sammanräkningstabell) från 1 till 100 i det här fallet med UNION ALL och CROSS JOIN . Ibland är det praktiskt att ha en riktig tabell i din db .
  • I yttre välj innersta SUBSTRING_INDEX() hämtar allt upp till n:te element i en lista och yttre SUBSTRING_INDEX() extrahera höger det mesta efter en sista avgränsare som effektivt får själva n:te elementet.
  • CROSS JOIN tillåter oss att producera en uppsättning rader som är en kartesisk produkt (med 100 rader i n och alla rader i eligibility_table)
  • skick i WHERE klausul filtrerar bort alla onödiga rader från resultatuppsättningen

Obs:den här frågan delar upp till 100 filial-ID. Om du behöver mer eller mindre kan du justera en gräns genom att redigera den inre underfrågan

Resultat i branch_table:

| ID | BRANCH_ID |
------------------
|  1 |       621 |
|  1 |       622 |
|  1 |       623 |
|  1 |       625 |
|  2 |       621 |
|  2 |       650 |

Här är SQLFiddle demo



  1. Oracle - hämta tabellnamn från sql-text

  2. Visa alla resultat i postgresql?

  3. Dataimport från MySQL med Sqoop - Fel:Ingen hanterare för anslutningssträng

  4. Lämnade gå med MAX(DATE)