河端善博 ブログ / SQL Server / PASSJ

SQL Server, .NET, PASSJ

  PASSJブログ :: ホーム :: 連絡をする :: RSS  :: ATOM :: Login
  945 投稿数 :: 112 ストーリー :: 1482 コメント :: 596 トラックバック

ニュース

Windows Live Alerts
My Yahoo!に追加
Add to Google dotnetnuke.jp
NPOPLUS.JP
MVP
PASSJ

記事のカテゴリ

過去の記事

カテゴリ

イメージギャラリ

.TEXT

INETA コミュニティ

MOM2005

MSMVP

PASSJ

SQL コミュニティ

セキュリティ TIPS

セキュリティのキホン

テスト

ブログ翻訳

多言語対応

.TEXT

INETA コミュニティ

MOM2005

MSMVP

PASSJ

SQL コミュニティ

セキュリティ TIPS

セキュリティのキホン

テスト

ブログ翻訳

多言語対応

文字列の前後の任意の文字を削除して、切り詰めます。
削除文字は、複数指定することができます。

■実行例

前後のハイフンとアスタリスクを削除します

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
投稿日時 : 2004年4月1日 16:02

コメントを追加

# re: TrimNA 関数 前後の任意の文字を削除した後の文字式を返します 2004/04/01 16:37 CAMUS
ループをまわさなくても、Replaceをうまく使えばいいのでは?
参考までに以下のクエリをどうぞ。
declare @strValue1 varchar(1000)
declare @strValue2 varchar(1000)
declare @strValue3 varchar(1000)

set @strValue1 = '-------------aaa--bbb---bbbbb---'
set @strValue2 = ltrim(rtrim(replace(@strValue1, '-', ' ')))
set @strValue3 = substring(@strValue1, patindex('%' + substring(@strValue2, 1, 1)+ '%', @strValue1), len(@strValue2))

select '''' + @strValue3 + ''''

# re: TrimNA 関数 前後の任意の文字を削除した後の文字式を返します 2004/04/02 11:17 河端善博
ありがとうございます
参考にして、最新版を作成しました。
30% 程度高速になりました。

# 4月以降の著者別ベストコンテンツ一覧 2004/05/13 9:17 河端善博の .TEXT でウェブログ
4月以降の著者別ベストコンテンツ一覧

コメント

タイトル:
名前:
Url:
コメント: