T-SQL - LEN() 関数は末尾の空白をカウントしない
T-SQL - LEN() 関数は末尾の空白をカウントしない
開発をしていると、文字列の末尾の数文字を削除したいような時がたまにありますよね。
LEFT() 関数や SUBSTRING() 関数と、 LEN() 関数を使って、以下のように削除する方法が思いつくかもしれません。
例えば、アルファベットが並んだ文字列から最後の 2 文字を削除するのであれば、次のような感じです。
DECLARE @Value VARCHAR(200) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; SELECT LEFT(@Value, LEN(@Value) - 2), SUBSTRING(@Value, 1, LEN(@Value) - 2);
この LEN() 関数で文字数を取得して - 2 した長さの文字数を取り出しているのですが、ここで注意が必要です。
LEN() 関数は末尾の空白をカウントしません。
末尾に空白を含む文字列に LEN() で文字数を取得すると、次のような結果になります。
SELECT LEN('ABC '), LEN(' ');
ですので、以下のような状況で同じ方法をつかって末尾の 2 文字を削除しようとしても、期待した結果が得られません。
DECLARE @Value VARCHAR(200) = 'Amazon, Rakuten, Yahoo Shopping, '; SELECT LEFT(@Value, LEN(@Value) - 2), SUBSTRING(@Value, 1, LEN(@Value) - 2);
LEN(@Value) が最後の空白を除いた文字数を返すため、g が切れてしまっていますね。
末尾のスペースは無視したいような状況であれば問題ないかと思いますが、この例のような状況の場合、区切り文字列も LEN() を使ってカウントするなど、なにかしらの工夫が必要になります。
DECLARE @Value VARCHAR(200) = 'Amazon, Rakuten, Yahoo Shopping, ', @Separator VARCHAR(2) = ', '; SELECT LEFT(@Value, LEN(@Value) - LEN(@Separator)), SUBSTRING(@Value, 1, LEN(@Value) - LEN(@Separator));
LEN() 関数が返す文字数には末尾の空白が含まれていないので、ご注意くださいね!