3

SQL の varchar から非数値データを削除する最良の方法を見つけようとしています。

'(082) 000-0000' to '0820000000' or
'+2782 000 0000' to '0820000000'

問題は、上に示したように、どの数値形式が入ってくるかが常にわからないことです。そのため、数値ではないものはすべて本質的に削除してほしいと思います。

更新:
皆さんが言ったことから、これは小さなスパイクです:

declare @Num varchar(20)

set @Num = ' + (82) 468 6152 '

--strip nonnumrical data out of @num

print @Num

set @Num = replace(@Num, ' ', '')
set @Num = replace(@Num, '+', '')
set @Num = replace(@Num, '-', '')
set @Num = replace(@Num, '(', '')
set @Num = replace(@Num, ')', '')

print @Num

ただし、置換 [^0-9] 式を正しく取得できませんでした。

4

4 に答える 4

4

SQL Server 2005 以降を使用している場合、最適なオプションは、ユーザー定義の CLR 関数を作成し、正規表現を使用して数値以外の文字をすべて削除することです。

CLR 関数を使用したくない場合は、標準のユーザー定義関数を作成できます。それほど効率的ではありませんが、これは仕事をします:

CREATE FUNCTION dbo.RemoveNonNumerics(@in VARCHAR(255))
RETURNS VARCHAR(255)
AS
BEGIN
    DECLARE @out VARCHAR(255)

    IF (@in IS NOT NULL)
    BEGIN
        SET @out = ''

        WHILE (@in <> '')
        BEGIN
            IF (@in LIKE '[0-9]%')
                SET @out = @out + SUBSTRING(@in, 1, 1)

            SET @in = SUBSTRING(@in, 2, LEN(@in) - 1)
        END
    END

    RETURN(@out)
END

そして、次のようにテーブルから選択します。

SELECT dbo.RemoveNonNumerics(your_column) AS your_tidy_column
FROM your_table
于 2009-03-10T14:52:13.927 に答える
1

SQL Server で正規表現を使用する方法を詳しく説明しているこの投稿(8 番目の投稿 - 最初の長い投稿) をご覧ください。これは最速ではありませんが (SQL に到達する前に実行する必要があります)、適切な方法を提供します。

于 2009-03-10T14:33:52.303 に答える
0

私が見つけた最も効果的で柔軟なのは、2009 年 3 月 10 日の mwigdahl の回答に示されているように、数値/集計表の方法を使用することです。

つまり、許可リストは、上記の質問の最後に記載した禁止リストよりもはるかに安全です。

あなたが述べていないのは、非整数をどのように処理するかです...小数点をどうしますか?

于 2011-01-19T14:05:17.910 に答える
0

ビジネス層で文字列解析を処理する方がはるかに簡単です。ただし、T-SQL REPLACE() 関数を使用することを明らかにします (MS SQL を想定)。

渡されたパラメーターでその関数を使用してループを実行し、数値以外の文字をすべて取り除くことができます。

于 2009-03-10T14:33:30.290 に答える