このような純粋な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 |
こちらが
これは、永続化された集計テーブルでクエリがどのように表示されるかを示しています
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
これが