SQL Server 2000:如何只返回电话号码列中的号码

Posted

技术标签:

【中文标题】SQL Server 2000:如何只返回电话号码列中的号码【英文标题】:SQL Server 2000: how do I return only the number from a phone number column 【发布时间】:2011-06-16 20:51:45 【问题描述】:

我正在尝试从每个电话号码中删除“(”、“)”、“-”、“x”或“X”“ext”和空格,所以我只剩下前 10 位数字或电话号码的前 10 个号码。

有没有一种简单的方法可以在 sql 2000 中只允许前 10 位数字通过。我正在考虑使用替换,但它需要对每个字符或字符组进行替换,而且不是很整洁。有没有办法在标准安装 sql2000 时只返回前 10 个数字。

之前和之后的示例

Before                      After
(555) 555-5555 ext55555     5555555555
340 555-5555                3405555555

【问题讨论】:

如果您发布代码、XML 或数据示例,在文本编辑器中突出显示这些行,然后单击编辑器上的“代码示例”按钮 ( )工具栏以很好地格式化和语法突出显示它! 【参考方案1】:

看看这是否有效:

Declare @Expression varchar(15)
Declare @MyVariable varchar(20)

Set @Expression = '%[^0-9]%' 
Set @MyVariable = '(555) 555-5555 ext55555'

While PatIndex(@Expression, @MyVariable) > 0
   Set @MyVariable = Stuff(@MyVariable, PatIndex(@Expression, @MyVariable), 1, '')

Print @MyVariable

555555555555

【讨论】:

【参考方案2】:

我认为您唯一的选择是创建一个可以执行此操作的 UDF。如果您使用的是 2005+,您可以创建一个 CLR 函数来执行此操作。

UDF:

create function dbo.RemoveNonNumericChar(@str varchar(500))  
returns varchar(500)  
begin  
declare @startingIndex int  
set @startingIndex=-1 
while @startingIndex <> 0 
begin  
    set @startingIndex= patindex('%[^0-9]%',@str)  
    if @startingIndex <> 0  
    begin  
        set @str = replace(@str,substring(@str,@startingIndex,1),'')  
    end   
end  
return @str  
end

go  

select dbo.RemoveNonNumericChar('(555) 555-5555 ext55555')  

【讨论】:

While 1=1... 真的吗?为什么不While @startingIndex &lt;&gt; 0? (并将上面的行更改为@startingIndex=-1 当然,我想我们可以做到。【参考方案3】:

如果您不想使用用户定义函数,另一种方法是使用 REPLACE 函数,如下所示:

SELECT Phone, REPLACE(REPLACE(REPLACE(REPLACE(Phone,' ',''),'(',''),')',''),'-','') AS NewPhone
FROM Contacts

虽然有点笨拙,但它应该可以满足您的目的。

【讨论】:

以上是关于SQL Server 2000:如何只返回电话号码列中的号码的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 9003错误解决方法 只适用于SQL2000

sql server 2000 单用户如何设置?

如何只修改一次sql server ce的列数据类型的长度?

如何让sqlserver 只返回年和月?

sql server 2000中,如何查询事务日志?事务日志有啥作用?

sql server 2000 日志备份