从数字中删除非数字数据 + SQL

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] 表达式。


啊,又一个南非人(或者至少是和南非有关的人)发现了SO :) - Robert MacLean
抱歉,各位,是的,我一直在使用 MS SQL ;) - Steven
4个回答

5
如果您使用的是SQL Server 2005或更高版本,则最好的选择是创建一个user-defined CLR function并使用正则表达式删除所有非数字字符。
如果您不想使用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

谢谢Luke,我有sql 2000,所以会尝试这个方法。 :) - Steven

1

请看这篇文章(它是第8篇文章 - 第一篇长篇)详细介绍了如何在SQL Server中使用正则表达式。虽然不是最快的方法(最好在进入SQL之前就做好),但它提供了一个不错的解决方案。


0
我发现最有效和灵活的方法是使用数字/记数表方法,正如mwigdahl在2009年3月10日的回答中所示。
也就是说,白名单比您在问题底部放置的不允许列表更安全。
您没有说明如何处理非整数……您对小数点做什么?

0

在业务层处理字符串解析要容易得多。但是,如果没有这个选项,可以使用 T-SQL REPLACE() 函数(假设使用 MS SQL)。

您可以对传递的参数执行循环,使用该函数将所有非数字字母都去除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接