SQL Server 2000:如何仅从电话号码列中返回数字

4
我正在尝试从每个电话号码中剥离出"(", ")", "-", "x"或"X",以及空格,这样我就只剩下了前10位数字或电话号码的第1个10位数字。
在SQL 2000中,是否有一种简单的方法只允许前10位数字通过呢?我考虑使用replace,但它需要替换每个字符或字符组,而且不太整洁。是否有一种使用标准安装的sql2000仅返回前10个数字的方法?
以下是示例:
Before                      After
(555) 555-5555 ext55555     5555555555
340 555-5555                3405555555

2
如果您发布代码、XML或数据样本,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮({})以使其格式化和语法高亮! - marc_s
3个回答

4
看看这个是否有效:
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


3

我认为你唯一的选择是创建一个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')  

2
当1=1时,真的吗?为什么不用While @startingIndex <> 0呢? (并将上面一行更改为@startingIndex=-1 - Hogan
当然,我想我们可以做到。 - Abe Miessler

0

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

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

虽然它有点笨重,但应该能满足你的需求。

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