我正在尝试找到从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]表达式。

有帮助吗?

解决方案

如果您使用的是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

其他提示

查看这篇文章(这是第8篇帖子down - 第一个LONG one),详细介绍了如何在SQL Server中使用正则表达式。它不是最快的(在你进入SQL之前就会这样做),但它提供了一种不错的方式来实现它。

根据您的DBMS,有几种不同的选择。

对于T-SQL,这个链接有一些很好的方法。

在业务层中处理字符串解析要容易得多。但是,baring使用T-SQL REPLACE()函数(假设MS SQL)。

您可以对传入的参数执行该函数的循环,以从中删除所有非数字字母。

您使用的是什么样的SQL后端?如果有一个regexp_replace类型的函数,你可以使用它来替换[^ 0-9]什么都没有。

我发现最有效和灵活的是使用数字/计数表方法,如2009年3月10日mwigdahl的回答所示

即。允许列表比您在上面问题的底部放置的不允许列表更安全。

你没有说明的是你如何处理非整数......你用小数点做什么?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top