T-SQL: 改行を挟んで複数行の文字列を結合する

複数行の文字列を結合してひとつの文字列にする

1 対 n となる親子関係のあるテーブルがあって、親テーブルの結果と共に、子テーブルの文字列を結合して、ひとつの文字列として返したいようなケースありますよね。

文字列を結合する際には、カンマやスペース等の区切り文字を入れることが多いかと思います。

今回は区切り文字として改行を挿入して文字列を結合する方法をご紹介します。


改行を挟んで文字列を結合する方法

例えば、次のような親子関係の Company テーブルと CompanyBranch テーブルがあります。

改行を挟んで複数行の文字列を結合する 1

改行を挟んで複数行の文字列を結合する 2

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;

T-SQL - 文字列に改行を挿入する 3

SQL Server Management Studio の結果のグリッドではわかりにくいかもしれませんが、結果をテキストに表示するとこうなります。

T-SQL - 文字列に改行を挿入する 4

これを C# などで Excel のセルに値を出力するとこんな感じの表を出力することができます。

T-SQL - 文字列に改行を挿入する 5


結果を確認したところで、どのように BranchList を生成したかを説明します。

まず、[BranchCode]: [Branch Name] の文字列を取得するクエリーに PATH モードの FOR XML 句を指定して、「|||」 で区切られたの文字列を生成しています。

その箇所だけを実行すると、このような結果になります。

T-SQL - 文字列に改行を挿入する 7


次に STUFF を使って、取得した文字列の先頭の区切り文字を取り除きます。

そして、最後に REPLACE を使って 「|||」 を、改行文字 CHAR(13) + CHAR(10) に置き換えることで、間に改行文字を挿入しています


区切り文字は何でもいいのですが、値に使われていないものを指定してください。

区切り文字を変える時は、以下の緑の部分を変更し、黄色で囲まれた部分に区切り文字の文字数を入れてください。

T-SQL - 文字列に改行を挿入する 6


改行の代わりにカンマなど他の文字を挿入することも可能です。 その時は CHAR(13) + CHAR(10) の変わりにその文字を指定してください。

これは改行の代わりに カンマ&空白を挿入した例です。

T-SQL - 文字列に改行を挿入する 8

この方法だと、元々の値にカンマが入っていてもカンマを区切り文字にすることが可能です。

今回はレコードがあまり入っていないテーブルからのデータの取得だったので、ひとつのクエリーで取得しましたが、レコード数の多いテーブルから取得する場合は、一度対象のデータをテンポラリーテーブルに取得してから、結合した文字列を生成するほうがパフォーマンスが良いかもしれません。
© 2010-2024 SQL Server 入門