数据修改问题

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


具体如何操作,请给出具体的语句,谢谢
...全文
103 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
先撤分,再删除,最后汇总

22,207

社区成员

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

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