sql >> データベース >  >> RDS >> Mysql

SQL分割コンマ区切り行

    このような純粋なSQLでそれを行うことができます

    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
    

    注: 秘訣は、tally(numbers)テーブルを活用することです。この場合、MySQL関数 SUBSTRING_INDEX() 。このようなクエリ(分割)を多数実行する場合は、この例のようにサブクエリを使用してオンザフライで生成するのではなく、永続化された集計テーブルにデータを入力して使用することを検討してください。この例のサブクエリは、1から100までの数値のシーケンスを生成し、ソーステーブルの行ごとに最大100の区切り値を効果的に分割できるようにします。多かれ少なかれ必要な場合は、簡単に調整できます。

    出力:

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

    こちらがSQLFiddle です。 デモ

    これは、永続化された集計テーブルでクエリがどのように表示されるかを示しています

    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
    

    これがSQLFiddle です。 デモ




    1. アプリケーションデータベースにとらわれない状態を維持する(ADO.NETとDBロジックのカプセル化)

    2. SQLステートメントですべてのパラメーターが使用されたわけではありません(Python、MySQL)

    3. PostgreSQLWhereカウント条件

    4. PostgreSQLCASE...複数の条件で終了