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;
まず、緑に囲まれた部分で、1 ~ [文字の長さ] までの番号の入った SeqNo カラムを持つ、SeqNoCTE を生成しています。
そこの部分だけを取り出して実行するとこんな感じです。
これに オレンジで囲まれた部分で CROSS APPLY と SUBSTRING 使って、@Memo の開始位置 SeqNo から 1 文字分を取得しています。
JOIN では右側のテーブルソースに、左側のテーブルソースの値を使用することはできないので、APPLY 演算子を使うことによって SeqNo を右側のテーブルソースに渡して使用しています。