一个字符串操作问题,头都想大了,大家帮帮忙
一个表中有一个名为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)