T-SQL: 改行を挟んで複数行の文字列を結合する
複数行の文字列を結合してひとつの文字列にする
1 対 n となる親子関係のあるテーブルがあって、親テーブルの結果と共に、子テーブルの文字列を結合して、ひとつの文字列として返したいようなケースありますよね。
文字列を結合する際には、カンマやスペース等の区切り文字を入れることが多いかと思います。
今回は区切り文字として改行を挿入して文字列を結合する方法をご紹介します。
改行を挟んで文字列を結合する方法
例えば、次のような親子関係の Company テーブルと CompanyBranch テーブルがあります。
CREATE TABLE Company ( CompanyID INT NOT NULL PRIMARY KEY, CompanyCode VARCHAR(50) NOT NULL, CompanyName VARCHAR(50) NOT NULL ); INSERT INTO Company (CompanyID, CompanyCode, CompanyName) VALUES (1, 'AAA', 'AAA Company'), (2, 'BBB', 'BBB Company'), (3, 'CCC', 'CCC Company'); CREATE TABLE CompanyBranch ( CompanyBranchID INT NOT NULL PRIMARY KEY, CompanyID INT NOT NULL, BranchCode VARCHAR(50) NOT NULL, BranchName VARCHAR(50) NOT NULL, CONSTRAINT FK_CompanyBranch FOREIGN KEY (CompanyID) REFERENCES Company(CompanyID) ); INSERT INTO CompanyBranch (CompanyBranchID, CompanyID, BranchCode, BranchName) VALUES (1, 1, 'LA', 'LA Branch'), (2, 1, 'NY', 'NY Branch'), (3, 1, 'SF', 'SF Branch'), (4, 2, 'HW', 'HW Branch'), (5, 3, 'SD', 'SD Branch'), (6, 3, 'FL', 'FL Branch');
Company テーブルの情報に加えて、CompanyBranch の情報を BranchList カラム として [BranchCode]: [Branch Name] を改行文字でつなげて取得してみましょう。
やり方はいろいろあると思いますが、例えばこんな感じでできると思います。
SELECT CompanyID, CompanyCode, CompanyName, REPLACE( STUFF((SELECT '|||' + CB.BranchCode + ': ' + CB.BranchName FROM CompanyBranch AS CB WITH (NOLOCK) WHERE CB.CompanyID = C.CompanyID ORDER BY CB.BranchCode FOR XML PATH (''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 3, ''), '|||', CHAR(13) + CHAR(10)) AS BranchList FROM Company AS C;
SQL Server Management Studio の結果のグリッドではわかりにくいかもしれませんが、結果をテキストに表示するとこうなります。
これを C# などで Excel のセルに値を出力するとこんな感じの表を出力することができます。
結果を確認したところで、どのように BranchList を生成したかを説明します。
まず、[BranchCode]: [Branch Name] の文字列を取得するクエリーに PATH モードの FOR XML 句を指定して、「|||」 で区切られたの文字列を生成しています。
その箇所だけを実行すると、このような結果になります。
次に STUFF を使って、取得した文字列の先頭の区切り文字を取り除きます。
そして、最後に REPLACE を使って 「|||」 を、改行文字 CHAR(13) + CHAR(10) に置き換えることで、間に改行文字を挿入しています
区切り文字は何でもいいのですが、値に使われていないものを指定してください。
区切り文字を変える時は、以下の緑の部分を変更し、黄色で囲まれた部分に区切り文字の文字数を入れてください。
改行の代わりにカンマなど他の文字を挿入することも可能です。 その時は CHAR(13) + CHAR(10) の変わりにその文字を指定してください。
これは改行の代わりに カンマ&空白を挿入した例です。
この方法だと、元々の値にカンマが入っていてもカンマを区切り文字にすることが可能です。