SQL初心者でも安心!T-SQLで部分文字列の出現位置を検索する方法
T-SQL で部分文字列の最後の出現位置を検索する
方法 1: REVERSE と CHARINDEX を使用する
- 検索対象文字列を反転させます。
- 反転させた文字列で部分文字列を検索します。
- 検索結果を元の文字列の長さから引きます。
-- サンプルデータ
DECLARE @str NVARCHAR(50) = 'T-SQL で部分文字列の最後の出現位置を検索する';
DECLARE @subStr NVARCHAR(50) = 'SQL';
-- 検索対象文字列を反転
DECLARE @reversedStr NVARCHAR(50) = REVERSE(@str);
-- 部分文字列の最後の出現位置を検索
DECLARE @lastIdx INT = CHARINDEX(@subStr, @reversedStr);
-- 結果を出力
SELECT @str AS 元の文字列,
@subStr AS 部分文字列,
@lastIdx - LEN(@str) AS 最後の出現位置;
- 部分文字列を検索対象文字列の末尾に繰り返します。
- 検索対象文字列の先頭から部分文字列の長さ * 反復回数分だけ切り取ります。
- 切り取られた文字列が元の文字列と一致すれば、それが最後の出現位置となります。
-- サンプルデータ
DECLARE @str NVARCHAR(50) = 'T-SQL で部分文字列の最後の出現位置を検索する';
DECLARE @subStr NVARCHAR(50) = 'SQL';
-- 部分文字列を検索対象文字列の末尾に繰り返す
DECLARE @repeatedStr NVARCHAR(400) = STUFF(@str, LEN(@str), 0, @subStr + REPLICATE(@subStr, 100));
-- 検索対象文字列の先頭から部分文字列の長さ * 反復回数分だけ切り取る
DECLARE @startIndex INT = PATINDEX(@subStr, @repeatedStr);
DECLARE @lastIdx INT = @startIndex - LEN(@subStr) * 100;
-- 結果を出力
SELECT @str AS 元の文字列,
@subStr AS 部分文字列,
@lastIdx AS 最後の出現位置;
補足
- 上記の例では、
NVARCHAR
データ型を使用しています。他のデータ型を使用する場合は、適切な型に変換する必要があります。 - 部分文字列が検索対象文字列内に存在しない場合は、
@lastIdx
変数は 0 になります。 - 性能面を考慮する場合は、方法 1の方が効率的に動作する可能性があります。
T-SQL で部分文字列の最後の出現位置を検索する - サンプルコード
DECLARE @str NVARCHAR(50) = 'T-SQL で部分文字列の最後の出現位置を検索する';
DECLARE @subStr NVARCHAR(50) = 'SQL';
-- 検索対象文字列を反転
DECLARE @reversedStr NVARCHAR(50) = REVERSE(@str);
-- 部分文字列の最後の出現位置を検索
DECLARE @lastIdx INT = CHARINDEX(@subStr, @reversedStr);
-- 結果を出力
SELECT @str AS 元の文字列,
@subStr AS 部分文字列,
@lastIdx - LEN(@str) AS 最後の出現位置;
-- 部分文字列を検索対象文字列の末尾に繰り返す
DECLARE @repeatedStr NVARCHAR(400) = STUFF(@str, LEN(@str), 0, @subStr + REPLICATE(@subStr, 100));
-- 検索対象文字列の先頭から部分文字列の長さ * 反復回数分だけ切り取る
DECLARE @startIndex INT = PATINDEX(@subStr, @repeatedStr);
DECLARE @lastIdx INT = @startIndex - LEN(@subStr) * 100;
-- 結果を出力
SELECT @str AS 元の文字列,
@subStr AS 部分文字列,
@lastIdx AS 最後の出現位置;
実行結果
元の文字列: T-SQL で部分文字列の最後の出現位置を検索する
部分文字列: SQL
最後の出現位置: 29
説明
- サンプルコードでは、
@str
変数に検索対象文字列、@subStr
変数に部分文字列を格納しています。 - 方法 1 では、
REVERSE
関数を使用して検索対象文字列を反転させ、CHARINDEX
関数を使用して部分文字列の最後の出現位置を検索します。 - 方法 2 では、
STUFF
関数を使用して部分文字列を検索対象文字列の末尾に繰り返し、PATINDEX
関数を使用して部分文字列の最初の出現位置を検索します。その後、LEN
関数を使用して部分文字列の長さを計算し、最後の出現位置を算出します。
- 上記の例はあくまで一例であり、状況に応じてコードを調整する必要があります。
T-SQL で部分文字列の最後の出現位置を検索する - その他の方法
方法 3: STRING_AGG と SUBSTRING_INDEX を使用する
この方法は、SQL Server 2016 以降でのみ使用可能です。
STRING_AGG
関数を使用して、部分文字列を区切り文字で区切った文字列に変換します。SUBSTRING_INDEX
関数を使用して、区切り文字で区切った文字列の最後の部分文字列を抽出します。- 抽出された部分文字列の長さを計算し、検索対象文字列の長さから引きます。
-- サンプルデータ
DECLARE @str NVARCHAR(50) = 'T-SQL で部分文字列の最後の出現位置を検索する';
DECLARE @subStr NVARCHAR(50) = 'SQL';
-- 部分文字列を区切り文字で区切った文字列に変換
DECLARE @delimitedStr NVARCHAR(400) = STRING_AGG(@subStr, ',', 1);
-- 区切り文字で区切った文字列の最後の部分文字列を抽出
DECLARE @lastSubStr NVARCHAR(50) = SUBSTRING_INDEX(@delimitedStr, ',', -1);
-- 結果を出力
SELECT @str AS 元の文字列,
@subStr AS 部分文字列,
LEN(@str) - LEN(@lastSubStr) AS 最後の出現位置;
方法 4: LEAD と LAG を使用する
LEAD
関数を使用して、現在の行から指定されたオフセット分の行の値を取得します。- 部分文字列が一致しない限り、
LAG
関数を使用して前の行の値を遡ります。 - 部分文字列が一致したら、現在の行の行番号を最後の出現位置として出力します。
-- サンプルデータ
DECLARE @str NVARCHAR(50) = 'T-SQL で部分文字列の最後の出現位置を検索する';
DECLARE @subStr NVARCHAR(50) = 'SQL';
-- 部分文字列が一致するまでの行番号を格納する変数
DECLARE @lastIdx INT;
WITH row_num AS (
SELECT ROW_NUMBER() OVER (ORDER BY 1) AS rn,
@str AS str
FROM dbo.SplitChars(@str, '')
)
SELECT @str AS 元の文字列,
@subStr AS 部分文字列,
MAX(rn) AS 最後の出現位置
FROM row_num
WHERE str = @subStr;
- 方法 3 は、比較的新しい関数である
STRING_AGG
とSUBSTRING_INDEX
を使用する点が特徴です。これらの関数は、部分文字列の処理に特化しており、コードが簡潔で分かりやすくなります。 - 方法 4 は、
LEAD
とLAG
関数を使用して、再帰的な処理を行う点が特徴です。この方法は、より複雑なロジックが必要な場合に適しています。
どの方法を選択するかは、状況によって異なります。以下の点を考慮して選択してください。
- 使用している SQL Server のバージョン
- コードの簡潔性と分かりやすさ
- 処理速度
- 必要なロジックの複雑さ
sql-server string t-sql