【问题标题】:Removing nonnumerical data out of a number + SQL从数字中删除非数字数据+ SQL
【发布时间】:2009-03-10 14:29:16
【问题描述】:

我正在尝试找到从 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 :)
  • 对不起伙计们,是的,我一直在使用 MS SQL ;)

标签: sql sql-server tsql numbers


【解决方案1】:

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

【讨论】:

  • 谢谢卢克,得到了 sql 2000,所以会去这样的。 :)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      你没有说的是你如何处理非整数......你如何处理小数点?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2013-03-20
        • 2013-06-24
        • 1970-01-01
        • 2012-04-13
        • 1970-01-01
        相关资源
        最近更新 更多