sql >> Databáze >  >> RDS >> Mysql

SQL rozdělený řádek oddělený čárkou

Můžete to udělat s čistým SQL takto

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

Poznámka: Trik je využít tabulku sčítání (čísla) a v tomto případě velmi šikovnou funkci MySQL SUBSTRING_INDEX() . Pokud provádíte mnoho takových dotazů (rozdělování), můžete zvážit naplnění a použití trvalé tabulky sčítání namísto jejího generování za běhu pomocí poddotazu jako v tomto příkladu. Poddotaz v tomto příkladu generuje posloupnost čísel od 1 do 100, což efektivně umožňuje rozdělit až 100 hodnot s oddělovači na řádek ve zdrojové tabulce. Pokud potřebujete více či méně, můžete to snadno upravit.

Výstup:

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

Zde je SQLFiddle demo

Takto může dotaz vypadat s trvalou tabulkou sčítání

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

Zde je SQLFiddle demo




  1. MySQL:Přístup odepřen uživateli 'test'@'localhost' (pomocí hesla:ANO) kromě uživatele root

  2. Je lepší vytvořit index před naplněním tabulky daty, nebo poté, co jsou data na svém místě?

  3. 7 věcí, které byste měli vědět o oddílech v infrastruktuře Oracle Cloud Infrastructure

  4. Tabulka popisu SQLite