求一个sql update语句

y63964632 2010-03-22 10:40:46
数据库中用户表中的电话号码过滤问题

目前有张用户表:

ID NAME TEL
1 www 13669142179.8712292
2 xxx null
3 zzz skjdfh
4 ddd 8721568 13609220863
5 eee 13891278888 8723120
6 mmm 15809125855.15991226088



数据有1w多条

我现在需要写一个update语句
把tel的内容进行过滤

得到结果

ID NAME TEL
1 www 13669142179
2 xxx null
3 zzz skjdfh
4 ddd 13609220863
5 eee 13891278888
6 mmm 15809125855

如果TEL内容中有134 135 136 137 138 139以及 150 151 152 157 158 159 188开头 的11位数字

则 把内容截取成一个移动的电话号码

不知道这么说是否清除?

主要是一个正则表达式

...全文
181 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
y63964632 2010-03-22
  • 打赏
  • 举报
回复
谢谢大家了
ws_hgo 2010-03-22
  • 打赏
  • 举报
回复
老D好快啊
dawugui 2010-03-22
  • 打赏
  • 举报
回复
--sql 2005
create table tb(ID int,NAME varchar(10),TEL varchar(50))
insert into tb values(1 ,'www' ,'13669142179,8712292')
insert into tb values(2 ,'xxx' ,null)
insert into tb values(3 ,'zzz' ,'skjdfh')
insert into tb values(4 ,'ddd' ,'8721568,13609220863')
insert into tb values(5 ,'eee' ,'13891278888,8723120')
insert into tb values(6 ,'mmm' ,'15809125855,15991226088')
go

select id , name , tel from
(
SELECT A.id,a.name ,B.tel
FROM(
SELECT id,name, [tel] = CONVERT(xml,'<root><v>' + REPLACE([tel], ',', '</v><v>') + '</v></root>') FROM tb
)A
OUTER APPLY(
SELECT tel = N.v.value('.', 'varchar(100)') FROM A.[tel].nodes('/root/v') N(v)
)B
) t
where left(tel,3) in ('136','159','138','158') and len(tel) = 11

drop table tb

/*
id name tel
----------- ---------- ----------------------------------------------------------------------------------------------------
1 www 13669142179
4 ddd 13609220863
5 eee 13891278888
6 mmm 15809125855
6 mmm 15991226088

(5 行受影响)

*/
dawugui 2010-03-22
  • 打赏
  • 举报
回复
--sql 2000(自己把所有可能存在的手机号前三位写全.)

create table tb(ID int,NAME varchar(10),TEL varchar(50))
insert into tb values(1 ,'www' ,'13669142179,8712292')
insert into tb values(2 ,'xxx' ,null)
insert into tb values(3 ,'zzz' ,'skjdfh')
insert into tb values(4 ,'ddd' ,'8721568,13609220863')
insert into tb values(5 ,'eee' ,'13891278888,8723120')
insert into tb values(6 ,'mmm' ,'15809125855,15991226088')
go


SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b

select id , name , tel from
(
SELECT A.id,a.name, tel = SUBSTRING(A.[tel], B.id, CHARINDEX(',', A.[tel] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[tel], B.id, 1) = ','
) t
where left(tel,3) in ('136','159','138','158') and len(tel) = 11

DROP TABLE #
drop table tb

/*
id name tel
----------- ---------- --------------------------------------------------
1 www 13669142179
5 eee 13891278888
6 mmm 15809125855
4 ddd 13609220863
6 mmm 15991226088

(所影响的行数为 5 行)
*/
y63964632 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 guguda2008 的回复:]
引用 4 楼 y63964632 的回复:

引用 2 楼 fredrickhu 的回复:
正则??为什么不用模糊匹配?


也可以 只需要得到结果

如果tel内容中有移动的电话号码 则把这个号码截取出来

如果一行中有两个号码呢
[/Quote]

只要一个
guguda2008 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 y63964632 的回复:]

引用 2 楼 fredrickhu 的回复:
正则??为什么不用模糊匹配?


也可以 只需要得到结果

如果tel内容中有移动的电话号码 则把这个号码截取出来
[/Quote]
如果一行中有两个号码呢
dawugui 2010-03-22
  • 打赏
  • 举报
回复
用拆分技术(如下),然后判断即可.条件为:left(tel) in ('130','131',...) and len(tel) = 11
/*
标题:数据拆分1
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-20
地点:广东深圳
描述

有表tb, 如下:
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
欲按id,分拆value列, 分拆后结果如下:
id value
----------- --------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
*/

--1. 旧的解决方法(sql server 2000)
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b

SELECT A.id, value = SUBSTRING(A.[value], B.id, CHARINDEX(',', A.[value] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[value], B.id, 1) = ','

DROP TABLE #

--2. 新的解决方法(sql server 2005)
create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go

--方法1)
SELECT A.id, B.value
FROM(
SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)B

--方法2)
select
a.id,b.[value]
from
(select id,[value]=convert(xml,'<root><v>'+replace([value],',','</v><v>')+'</v></root>') from tb)a
outer apply
(select [value]=C.v.value('.','nvarchar(100)') from a.[value].nodes('/root/v')C(v))b

--方法3)
;with tt as
(select id,[value]=cast(left([value],charindex(',',[value]+',')-1) as nvarchar(100)),Split=cast(stuff([value]+',',1,charindex(',',[value]+','),'') as nvarchar(100)) from tb
union all
select id,[value]=cast(left(Split,charindex(',',Split)-1) as nvarchar(100)),Split= cast(stuff(Split,1,charindex(',',Split),'') as nvarchar(100)) from tt where split>''
)
select id,[value] from tt order by id option (MAXRECURSION 0)


DROP TABLE tb

/*
id value
----------- ------------------------------
1 aa
1 bb
2 aaa
2 bbb
2 ccc

(5 行受影响)
*/



y63964632 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]
正则??为什么不用模糊匹配?
[/Quote]

也可以 只需要得到结果

如果tel内容中有移动的电话号码 则把这个号码截取出来
guguda2008 2010-03-22
  • 打赏
  • 举报
回复
想要什么结果
--小F-- 2010-03-22
  • 打赏
  • 举报
回复
正则??为什么不用模糊匹配?
bancxc 2010-03-22
  • 打赏
  • 举报
回复
帮顶 曾分

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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