数据修改问题

boy7470 2011-01-27 02:48:01
我的数据库内email字段内有如下格式的内容,

1.adfadf@126.com@163.com、adfadf@sina.com@sohu.com、adfadf@tom.com@163.com

2.1.adfadf@126.com.com、adfadf@sina.com.com

1.现在我想把email字段内第二个@删除包括@之后的内容,2.删除第二个.com

最后结果:1.adfadf@126.com、adfadf@sina.com、adfadf@tom.com

2.1.adfadf@126.com、adfadf@sina.com


具体如何操作,请给出具体的语句,谢谢
...全文
78 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Linares 2011-01-28
select dbo.RegexReplace(email, '(?<=@[^@、]*)@[^@、]*|(?<=\.com)\.com', '', 1, 1) from @table
回复
叶子 2011-01-28

declare @table table(email varchar(200))
insert into @table
select '1.adfadf@126.com@163.com、adfadf@sina.com@sohu.com、adfadf@tom.com@163.com'
union all
select '2.1.adfadf@126.com.com、adfadf@sina.com.com'

select dbo.regexReplace (email,'.com[@][a-z0-9]+.com[、]','.com、',1,0) from @table

/*
1.adfadf@126.com、adfadf@sina.com、adfadf@tom.com@163.com
2.1.adfadf@126.com.com、adfadf@sina.com.com
*/

这样可以替换掉2个。正则我超级菜鸟
回复
叶子 2011-01-28

--开启xp_cmdshell
--SQL Server blocked access to procedure 'xp_cmdshell'
sp_configure 'show advanced options', 1
go
reconfigure
go
sp_configure 'xp_cmdshell', 1
go
reconfigure
go
--开启sp_OACreate
--SQL Server blocked access to procedure 'sys.sp_OACreate'
sp_configure 'show advanced options', 1;
go
reconfigure;
go
sp_configure 'ole automation procedures', 1;
go
reconfigure;
go

create function [dbo].[regexReplace]
(
@source varchar(5000), --原字符串
@regexp varchar(1000), --正则表换式
@replace varchar(1000), --替换值
@globalReplace bit = 0, --是否是全局替换
@ignoreCase bit = 0 --是否忽略大小写
)
returns varchar(1000) AS
begin
declare @hr integer
declare @objRegExp integer
declare @result varchar(5000)

exec @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Pattern', @regexp
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'Global', @globalReplace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignoreCase
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OAMethod @objRegExp, 'Replace', @result OUTPUT, @source, @replace
IF @hr <> 0 begin
exec @hr = sp_OADestroy @objRegExp
return null
end
exec @hr = sp_OADestroy @objRegExp
IF @hr <> 0 begin
return null
end
return @result
end

declare @table table(email varchar(200))
insert into @table
select '1.adfadf@126.com@163.com、adfadf@sina.com@sohu.com、adfadf@tom.com@163.com'
union all
select '2.1.adfadf@126.com.com、adfadf@sina.com.com'

select dbo.regexReplace (email,'.com[@][s][o][h][u].com、','.com、',1,0) from @table

/*
1.adfadf@126.com@163.com、adfadf@sina.com、adfadf@tom.com@163.com
2.1.adfadf@126.com.com、adfadf@sina.com.com
*/

--这个正则我写不出来regexReplace 的第二个参数是正则。
回复
xiaoguanzhao 2011-01-28
楼主可以用笨笨的办法,后面的com@163.com结合是有限的,直接把@163.com这段给截掉就行了
update TableName
set Email = case
when Email like '%com@163.com%' then substr(email,1,LENGTH(email)-8))
when Email like '%com@sohu.com%' then substr(email,1,LENGTH(email)-9))
when Email like '%com@163.com' then substr(email,1,LENGTH(email)-8))
when Email ……
end
回复
dawugui 2011-01-27
[Quote=引用 4 楼 boy7470 的回复:]
数据量非常大,还没有别的办法
[/Quote]
这个用sql来做,貌似难了.

我建议把数据想办法按照你的分割内容,导入到dbf库中去做,这样简单得多.

帮顶.
回复
luisic 2011-01-27
先分离,再删除,然后合并
回复
boy7470 2011-01-27
数据量非常大,还没有别的办法
回复
Oraclers 2011-01-27
在查询分析器执行下列语句,请在操作前做好数据库备份。
update TableName
set Email = case
when Email like '%adfadf@126.com%' then 'adfadf@126.com'
when Email like '%adfadf@sina.com%' then 'adfadf@sina.com'
when Email like '%adfadf@tom.com%' then 'adfadf@tom.com'
end
go
回复
幸运的意外 2011-01-27
单元SQL Server支持正则表达式
回复
华夏小卒 2011-01-27
先撤分,再删除,最后汇总
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2011-01-27 02:48
社区公告
暂无公告