T-SQL で 文字列 NVARCHAR を一文字ずつに分割した列にする方法

文字列を一文字ずつに分割したい

クエリーで NVARCHAR 型などの文字列を一文字ずつに分解して、バリデーションや変換などを行いたいような時はないでしょうか。

文字列を一文字ずつに分割する方法には、素直にループして取り出していく方法や SQL Server の他のオブジェクトを使って番号テーブルを生成して使用する方法など、いろんな方法があります。

ここでは、ループをしないでお手軽に使えるクエリーをご紹介します。

共通テーブル式 (CTE) を使って、文字列を一文字ずつに分割する

ループをせずに文字列を分割する為には、1, 2, 3, 4, ... と数字が入った番号テーブルが必要になります。

その番号テーブルを共通テーブル式 (CTE) を使って生成し、文字列を一文字ずつに分割するクエリーは以下の通りです。

DECLARE @Memo NVARCHAR(MAX) = N'これはメモです。 ABC';

;WITH SeqNoCTE (SeqNo) AS
(
   SELECT 1
   UNION ALL 
   SELECT SeqNo + 1 
   FROM	  SeqNoCTE
   WHERE  SeqNo < LEN(@Memo)
)
SELECT	S.SeqNo,
	M.Char1
FROM	SeqNoCTE AS S
	   CROSS APPLY 
	      (SELECT SUBSTRING(@Memo, S.SeqNo, 1) AS Char1) AS M
ORDER BY S.SeqNo;

T-SQL で 文字列 NVARCHAR を一文字ずつに分割した列にする方法 1

まず、緑に囲まれた部分で、1 ~ [文字の長さ] までの番号の入った SeqNo カラムを持つ、SeqNoCTE を生成しています。

そこの部分だけを取り出して実行するとこんな感じです。

T-SQL で 文字列 NVARCHAR を一文字ずつに分割した列にする方法 2

これに オレンジで囲まれた部分で CROSS APPLY と SUBSTRING 使って、@Memo の開始位置 SeqNo から 1 文字分を取得しています。

JOIN では右側のテーブルソースに、左側のテーブルソースの値を使用することはできないので、APPLY 演算子を使うことによって SeqNo を右側のテーブルソースに渡して使用しています。

© 2010-2024 SQL Server 入門