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

从数字中删除非数字数据+;SQL,sql,sql-server,tsql,numbers,Sql,Sql Server,Tsql,Numbers,我正在试图找到从SQL中的varchar中删除非数字数据的最佳方法 '(082) 000-0000' to '0820000000' or '+2782 000 0000' to '0820000000' 困难在于我并不总是确定会出现什么数字格式,如上所示,所以我希望从本质上删除所有不是数字的内容 更新: 从你们所说的,这是一个小钉子做: declare @Num varchar(20) set @Num = ' + (82) 468 6152 ' --strip nonnumrical

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

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


您可以在传入的参数上使用该函数进行循环,以去除其中的所有非数字字母。

看一看(这是第8篇文章-第一篇长文章),其中详细介绍了如何在SQL Server中使用正则表达式。它不是最快的(在使用SQL之前就可以完成),但它提供了一种不错的方式。

您使用的SQL后端是什么风格的?如果有一个regexp_replace类函数,您可以使用该函数将[^0-9]替换为零。

如果您使用的是SQL Server 2005或更新版本,那么最好的选择是创建一个正则表达式,并使用正则表达式删除所有非数字字符

如果不想使用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

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

i、 e.允许列表比您在上述问题底部列出的不允许列表安全得多


您没有说明的是如何处理非整数。。。你怎么处理小数点?

啊,另一个南非人(或者至少是与南非打交道的人)发现:)对不起,伙计们,是的,我一直在使用MS SQL;)感谢Luke,获得了sql 2000,因此我们将采用类似的方式:
SELECT dbo.RemoveNonNumerics(your_column) AS your_tidy_column
FROM your_table