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

Opdel (eksploder) kommaseparerede kolonneværdier til rækker

OPDATERET Du kan gøre det med SQL på denne måde

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
  • Underforespørgslen med et alias på n genererer i farten en sekvens af tal (tal eller taltabel) fra 1 til 100 i dette særlige tilfælde ved hjælp af UNION ALL og CROSS JOIN . Nogle gange er det praktisk at have en rigtig optællingstabel i din db .
  • I ydre vælg inderste SUBSTRING_INDEX() henter alt op til n'te element i en liste og ydre SUBSTRING_INDEX() udtræk højre det meste efter en sidste afgrænsning, der effektivt får selve n-te element.
  • CROSS JOIN giver os mulighed for at producere et sæt rækker, som er et kartesisk produkt (på 100 rækker i n og alle rækker i eligibility_table)
  • tilstand i WHERE klausul filtrerer alle unødvendige rækker fra resultatsættet

Bemærk:denne forespørgsel vil opdele op til 100 filial-id'er. Hvis du har brug for mere eller mindre, kan du justere en grænse ved at redigere den indre underforespørgsel

Resultat i branch_table:

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

Her er SQLFiddle demo



  1. Find ud af, hvilket valutasymbol din session bruger i Oracle

  2. mysql_fetch_array returnerer kun én række

  3. To venstre joins giver mig usande data (dobbelte data?) med MySQL

  4. SQL Sorter efter streng, tal vises sidst