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

kekan 2007-04-03 02:36:54
一个表中有一个名为PHONE的键值(CHAR型),记录的是电话号码,但此时有多种格式的电话号码存在,如
手机号码(如13811111111)、
固定电话号码(如3034444)、
区号+“-”+固定电话(如021-3034444)、
区号+空格+固定电话(如021 3034444)、
区号+固定电话(如0213034444)、
区号+手机号码(如02113811111111),
还有就是其他无意义的号码(如数个0或是就区号存在)。
现在想把该值整理下,只保留手机号码(11位)和固定电话号码(7位),去掉号码前的区号、空格、和符号“-”,怎么办。
表名假定为aaa。
谢谢大家。
...全文
176 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
paoluo 2007-04-03
  • 打赏
  • 举报
回复
4位区号+7位固话号码=11位(和手机号长度一样)
3位区号+8位固话号码=11位(和手机号长度一样)

這個也解決了?!
kekan 2007-04-03
  • 打赏
  • 举报
回复
非常感谢gahade(与君共勉)
问题已经解决了。
gahade 2007-04-03
  • 打赏
  • 举报
回复
--手机号码的第1位应该都是1.根据这点可以判断是4位的区号+7位的固话
when len(ltrim(rtrim(PHONE)))=11 and left(ltrim(rtrim(PHONE)),1)<>'1' then right(ltrim(rtrim(PHONE)),7)
kekan 2007-04-03
  • 打赏
  • 举报
回复
谢谢gahade(与君共勉) ,
就是还有个问题,我上面举的例子里区号为3位,但如果区号为4位的时候,加起来刚好是手机号码的11位,在
when len(ltrim(rtrim(PHONE)))=10 then right(ltrim(rtrim(PHONE)),7)
when len(ltrim(rtrim(PHONE)))=14 then right(ltrim(rtrim(PHONE)),11)

这里就会产生误操作了。
paoluo 2007-04-03
  • 打赏
  • 举报
回复
4位区号+7位固话号码=11位(和手机号长度一样)
3位区号+8位固话号码=11位(和手机号长度一样)

-------

就這個比較難拆分了。

不好分辨哪個是3位的區號,哪個是4位的區號。
ojuju10 2007-04-03
  • 打赏
  • 举报
回复
你的这个没有什么规律,不好用一个sql语句实现
gahade 2007-04-03
  • 打赏
  • 举报
回复
那楼主这个规则就有很多了.

4位区号+7位固话号码=11位(和手机号长度一样)
4位区号+'-'+7位固话号码=12位
3位区号+8位固话号码=11位(和手机号长度一样)
3位区号+'-'+8位固话号码=12位
4位区号+11位手机号=15位
4位区号+'-'+11位手机号=16位
gahade 2007-04-03
  • 打赏
  • 举报
回复
结果是这个

PHONE
------------------
13811111111
3034444
3034444
3034444
3034444
13811111111

(所影响的行数为 6 行)
gahade 2007-04-03
  • 打赏
  • 举报
回复
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 行)
paoluo 2007-04-03
  • 打赏
  • 举报
回复
when len(PHONE)=10 then right(PHONE,7)
-------

這個判斷不對,固定电话有7位和八位的。
caijunling 2007-04-03
  • 打赏
  • 举报
回复
Sql 2005 模糊查找
gahade 2007-04-03
  • 打赏
  • 举报
回复
update aaa
set PHONE = case when charindex('-',PHONE)>0 then substring(PHONE,charindex('-',PHONE),len(PHONE))
when charindex(' ',PHONE)>0 then substring(PHONE,charindex(' ',PHONE),len(PHONE))
when len(PHONE)=10 then right(PHONE,7)
when len(PHONE)=14 then right(PHONE,11)
else PHONE end
from aaa

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧