カンマ区切りの文字列を個々の行に変換する方法 (SQL Server, CSV, T-SQL)
Comma Separated string を個々の行に変換する (SQL Server, CSV, T-SQL)
方法
この処理を行う方法はいくつかありますが、ここではT-SQLを使用して行う方法を紹介します。
SPLIT 関数は、文字列を指定された区切り文字で分割し、結果をテーブル形式で返す関数です。
SELECT
value
FROM
(
SELECT
SPLIT(@comma_separated_string, ',') AS value
) AS t;
上記コードは、@comma_separated_string
という変数に格納されたカンマ区切りの文字列を分割し、結果を value
という列名で返します。
STRING_SPLIT 関数は、SQL Server 2016以降で導入された関数で、SPLIT 関数と同様の機能を提供します。
SELECT
value
FROM
STRING_SPLIT(@comma_separated_string, ',');
FOR XML PATH('') は、XML を生成するために使用される構文ですが、カンマ区切りの文字列を個々の行に変換するのにも使用できます。
SELECT
value
FROM
(
SELECT
@comma_separated_string AS value
FOR XML PATH('')
) AS t
CROSS APPLY
(
SELECT
value = substring(t.value, 1, charindex(',', t.value) - 1)
WHERE
charindex(',', t.value) > 0
UNION ALL
SELECT
value = substring(t.value, charindex(',', t.value) + 1, len(t.value))
WHERE
charindex(',', t.value) > 0
) AS c;
上記で紹介した方法は、いずれもカンマ区切りの文字列を個々の行に変換する方法です。それぞれの方法にはメリットとデメリットがあるので、状況に応じて使い分けることが重要です。
- SPLIT 関数: シンプルで使いやすい
- STRING_SPLIT 関数: SQL Server 2016以降で使用可能
- FOR XML PATH(''): 複雑な処理にも対応可能
補足
- 上記のコードは、カンマ区切り文字列を分割する例です。区切り文字が異なる場合は、コードを修正する必要があります。
- 空白文字を含む文字列を分割する場合は、TRIM 関数などを組み合わせて使用します。
SPLIT 関数を使う
DECLARE @comma_separated_string VARCHAR(MAX) = 'a,b,c,d,e';
SELECT
value
FROM
(
SELECT
SPLIT(@comma_separated_string, ',') AS value
) AS t;
STRING_SPLIT 関数を使う
DECLARE @comma_separated_string VARCHAR(MAX) = 'a,b,c,d,e';
SELECT
value
FROM
STRING_SPLIT(@comma_separated_string, ',');
FOR XML PATH('') を使う
DECLARE @comma_separated_string VARCHAR(MAX) = 'a,b,c,d,e';
SELECT
value
FROM
(
SELECT
@comma_separated_string AS value
FOR XML PATH('')
) AS t
CROSS APPLY
(
SELECT
value = substring(t.value, 1, charindex(',', t.value) - 1)
WHERE
charindex(',', t.value) > 0
UNION ALL
SELECT
value = substring(t.value, charindex(',', t.value) + 1, len(t.value))
WHERE
charindex(',', t.value) > 0
) AS c;
実行方法
上記コードを SQL Server Management Studio などのツールで実行すると、以下の結果が表示されます。
value
-------
a
b
c
d
e
カンマ区切りの文字列を個々の行に変換するその他の方法
TALBE 関数は、文字列をテーブル形式に変換する関数です。
SELECT
value
FROM
(
SELECT
value
FROM
TABLE (
SPLIT(@comma_separated_string, ',')
) AS t
) AS c;
OPENROWSET 関数は、外部データソースからデータを読み込む関数です。
SELECT
value
FROM
OPENROWSET (
BULK N'@comma_separated_string',
SINGLE_CHAR
) AS t
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
レコードセットを使用する
ADO.NET などの技術を使用して、レコードセットを作成し、カンマ区切りの文字列を個々の行に変換することもできます。
PowerShell を使用して、カンマ区切りの文字列を個々の行に変換することもできます。
- レコードセット: ADO.NET などの技術を使用している場合に便利
- PowerShell: 柔軟な処理が可能
sql-server csv t-sql