字符串替换问题
表AerrorName rightName
牛得华 刘德华
脏三 张三
...
表B
singer 正确的值应为:
牛得华 刘德华
牛得华_脏三 刘德华_张三
脏三 张三
刘德华_脏三 刘德华_张三
牛得华_牛得华_牛得华 刘德华_刘德华_刘德华
...
需求:
把B表中的singer字段在A表中包含errorName的换成rightName 然后保存在singer字段中 singer可能包含多个error,如表B的第二条数据。
就是把B中singer字段中错误的子串换成正确的子串,B表就相当一个纠错表, 如在B中没有找到错误的,就不处理他。
在C#程序里处理还是在数据库处理,效率哪个好?哪种算法更好?注意效率,数据会很大,至少几十W条
几个说明事项: 在A表在,以最先出现在子串为优先级,替换掉了,如下:
表A:
errorName rightName
牛得华 刘德华
华 花
我们要替换的是字符串"牛得华" 则正确值为“刘德华"
我们要替换的是字符串"牛得华_华" 则正确值为“刘德华_花"
表A:
errorName rightName
华 花
牛得华 刘德华
我们要替换的是字符串"牛得华" 则正确值为"刘德花"
我的方法:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
create FUNCTION [dbo].[GetRightName]
(
@singer varchar(50)
)
RETURNS varchar(50)
AS
BEGIN
DECLARE @result varchar(50)
DECLARE @errorName varchar(50)
DECLARE @rightname varchar(50)
/*下面两个判断是把目标字符串中的vs与&换成_,统一*/
if(charindex('&',@singer)>0)
set @singer=(select replace(@singer,'&','_'))
if(charindex('vs',@singer)>0)
set @singer=(select replace(@singer,'vs','_'))
if(charindex('_',@singer)>0)
begin
set @rightname=( select top 1 rightname from A where charindex(errorName,@singer)>0)
set @errorName =( select top 1 errorNamefrom A where charindex(errorName,@singer)>0)
if(@rightname is null)
set @result=@singer
else
set @result=(select replace(@singer,@errorName ,@rightname))
end
else
begin
set @result=( select top 1 rightname from A where errorName=@singer)
if(@result is null)
set @result=@singer
end
RETURN @result
END
C#调用修改语句如下:
update B set singer=dbo.GetRigthName(singer) where singer not in(select rightName from A)
每次执行只会替换一个子串,有几个_,多执行几次就行了。因为表B会添加新的,所以会常执行这个修改语句,所以就不用一次把所有的错误子串都替换了。
欢迎大家讨论,有好的方法,一定要拿出来大家一起分享哟。
--------------------编程问答-------------------- C#调用修改语句如下:
update B set singer=dbo.GetRigthName(singer) where singer not in(select rightName from A)
与
update B set singer=dbo.GetRigthName(singer)
都可以。
自已先顶下。。
补充:.NET技术 , ASP.NET