文字列の前後の任意の文字を削除して、切り詰めます。
削除文字は、複数指定することができます。
■実行例
前後のハイフンとアスタリスクを削除します
SELECT dbo.TrimNA('--ABC***', '-*')
結果: ABC
■仕様
- 構文: TrimNA(対象文字列, 削除文字列)
- 引数
- 対象文字列 NVARCHAR(4000)
- 削除文字列 NVARCHAR(4000)
- 戻り値 NVARCHAR(4000)
■ユーザー定義関数 (最新版)
CREATE FUNCTION dbo.TrimNA
(
@value NVARCHAR(4000),
@chars NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
-- 変数宣言
DECLARE @p INT
DECLARE @start INT
DECLARE @len INT
DECLARE @c nchar
DECLARE @t NVARCHAR(4000)
-- 元の文字列が NULL の場合
IF @value IS NULL
RETURN NULL
-- 削除対象文字列が NULL または空の場合
IF (@chars IS NULL) OR (DATALENGTH(@chars) = 0)
RETURN @value
-- 元の文字数が 0 の場合
IF LEN(@value) = 0
RETURN ''
-- 削除文字をすべてスペースに置き換える
SET @p = 1
SET @c = LEN(@chars)
SET @t = @value
WHILE @p <= @c
BEGIN
SET @t = REPLACE(@t, SUBSTRING(@chars, @p, 1), ' ')
SET @p = @p + 1
END
SET @t = LTRIM(@t)
-- 置き換え後の文字列の長さ
-- LEN 関数は、自動的に RTRIM することに注意
SET @len = LEN(@t)
IF @len = 0
RETURN ''
-- 置き換え後の文字列の最初の一文字が、
-- 元の文字列に現れる位置を調べる
SET @p = CHARINDEX(SUBSTRING(@t, 1, 1), @value)
IF @p = 0
RETURN ''
-- 結果を返す
RETURN SUBSTRING(@value, @p, @len)
END
■ユーザー関数定義 (元のバージョン)
CREATE FUNCTION dbo.TrimNA
(
@value NVARCHAR(4000),
@chars NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
-- 変数宣言
DECLARE @p INT
DECLARE @start INT
DECLARE @end INT
DECLARE @c nchar
-- 元の文字列が NULL の場合
IF @value IS NULL
RETURN NULL
-- 削除対象文字列が NULL または空の場合
IF (@chars IS NULL) OR (DATALENGTH(@chars) = 0)
RETURN @value
-- 元の文字列の文字数
SET @end = LEN(@value)
-- 元の文字数が 0 の場合
IF @end = 0
RETURN ''
-- 先頭部分の削除を判定
SET @p = 1
SET @start = @end + 1
WHILE (@p <= @end)
BEGIN
SET @c = SUBSTRING(@value, @p, 1)
IF CHARINDEX(@c, @chars) = 0
BEGIN
SET @start = @p
BREAK
END
SET @p = @p + 1
END
-- 元の文字列をすべて削除した場合
IF @start > @end
RETURN ''
-- 最後の部分の削除を判定
SET @p = @end
WHILE (@p > @start)
BEGIN
SET @c = SUBSTRING(@value, @p, 1)
IF CHARINDEX(@c, @chars) = 0
BEGIN
SET @end = @p
BREAK
END
SET @p = @p - 1
END
-- 結果を返す
RETURN SUBSTRING(@value, @start, @end - @start + 1)
END