当前位置:编程学习 > C#/ASP.NET >>

字符串替换问题

表A
errorName 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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,