ホームページ >データベース >mysql チュートリアル >SQL のカンマ区切り値を複数の行に分割するにはどうすればよいですか?

SQL のカンマ区切り値を複数の行に分割するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-24 04:22:11134ブラウズ

How to Split Comma-Separated Values in SQL into Multiple Rows?

カンマ区切りの SQL 値を複数の行に変換する

頻繁に行われる SQL タスクには、単一セルの内容を複数の行に分割することが含まれます。 たとえば、次のテーブルについて考えてみましょう:

<code class="language-sql">id | name
1  | a,b,c
2  | b</code>

目標は、このデータを次のように再構成することです:

<code class="language-sql">id | name
1  | a
1  | b
1  | c
2  | b</code>

方法 1: 数値表を利用する

効果的な解決策の 1 つは、既存の「数値」テーブル (整数の連続リストを含むテーブル) を利用することです。 以下のクエリは、このアプローチを示しています:

<code class="language-sql">SELECT
  tablename.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) AS name
FROM
  numbers
INNER JOIN
  tablename
ON
  CHAR_LENGTH(tablename.name) - CHAR_LENGTH(REPLACE(tablename.name, ',', '')) >= numbers.n - 1
ORDER BY
  id, n</code>

方法 2: 数値を動的に生成する (数値テーブルは必要ありません)

専用の数値テーブルが利用できない場合は、クエリ自体内で一時的な数値シーケンスを生成できます。

<code class="language-sql">SELECT
  tablename.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) AS name
FROM
  (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) AS numbers
INNER JOIN
  tablename
ON
  CHAR_LENGTH(tablename.name) - CHAR_LENGTH(REPLACE(tablename.name, ',', '')) >= numbers.n - 1
ORDER BY
  id, n</code>

UNION ALL 列で予想されるカンマ区切り値の最大数に対応できるように、2 番目の方法の name セクションを必ず調整してください。 どちらの方法でも、カンマ区切りの値を個々の行に分割するという同じ結果が得られます。

以上がSQL のカンマ区切り値を複数の行に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。