首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

一个字符串操作有关问题,头都想大了,大家帮帮忙

2012-01-12 
一个字符串操作问题,头都想大了,大家帮帮忙一个表中有一个名为PHONE的键值(CHAR型),记录的是电话号码,但此

一个字符串操作问题,头都想大了,大家帮帮忙
一个表中有一个名为PHONE的键值(CHAR型),记录的是电话号码,但此时有多种格式的电话号码存在,如
        手机号码(如13811111111)、
        固定电话号码(如3034444)、
        区号+“-”+固定电话(如021-3034444)、
        区号+空格+固定电话(如021   3034444)、
        区号+固定电话(如0213034444)、
        区号+手机号码(如02113811111111),
还有就是其他无意义的号码(如数个0或是就区号存在)。
        现在想把该值整理下,只保留手机号码(11位)和固定电话号码(7位),去掉号码前的区号、空格、和符号“-”,怎么办。
        表名假定为aaa。
        谢谢大家。

[解决办法]
drop table aaa
go
create table aaa(PHONE char(100))
insert into aaa
select '13811111111 '
union all select '3034444 '
union all select '021-3034444 '
union all select '021 3034444 '
union all select '0213034444 '
union all select '02113811111111 '
union all select '0000000000000000 '
union all select '010 '
union all select 'ddddddddd '

update aaa
set PHONE = case when charindex( '- ',ltrim(rtrim(PHONE)))> 0 then substring(ltrim(rtrim(PHONE)),charindex( '- ',ltrim(rtrim(PHONE)))+1,len(ltrim(rtrim(PHONE))))
when charindex( ' ',ltrim(rtrim(PHONE)))> 0 then substring(ltrim(rtrim(PHONE)),charindex( ' ',ltrim(rtrim(PHONE)))+1,len(ltrim(rtrim(PHONE))))
when len(ltrim(rtrim(PHONE)))=10 then right(ltrim(rtrim(PHONE)),7)
when len(ltrim(rtrim(PHONE)))=14 then right(ltrim(rtrim(PHONE)),11)
else ltrim(rtrim(PHONE)) end
from aaa

delete from aaa where len(ltrim(rtrim(phone))) not in (11,7)

select * from aaa

PHONE
---------------------
13811111111
3034444
3034444
3034444
3034444
13811111111
0000000000000000
010
ddddddddd

(所影响的行数为 9 行)
[解决办法]
--手机号码的第1位应该都是1.根据这点可以判断是4位的区号+7位的固话
when len(ltrim(rtrim(PHONE)))=11 and left(ltrim(rtrim(PHONE)),1) <> '1 ' then right(ltrim(rtrim(PHONE)),7)

热点排行