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 <> 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 ce的列数据类型的长度?