一个replace的小讨论2
在mssql中replace可以替换相应的字符,如我要替换
declare @str varchar(20)
set @str = 'abcdefghijk '
print @str
print replace(@str, 'b ', 'x ') -- 得到结果 axcdefghijk
替换一个字符很容易,但是现在如果要替换字符b、d为x呢?
我想到的一个办法(嵌套来替换)
print replace(replace(@str, 'b ', 'x '), 'd ', 'x ') -- 得到结果 axcxefghijk
现在如果要替换再多点的字符b、d、g、j为x呢?
若按照老方法,嵌套下去代码越来越多、繁琐,请大家看看有没有什么简单明了点的方法,比如使用类似in的方法。
现在有字符串A:abcdefghijk
需要将串A中的:acegik 替换成对应的:XYZNPQ
空闲时间还是自己搞了下,写了一个处理过程,很粗略实现功能,就当作抛砖引玉了,各位高手欢迎发表自己的解决方法啊!!!
declare @str varchar(2000),@srcKey varchar(20),@desKey varchar(20),@result varchar(20)
declare @sql varchar(2000),@tmpSrcStr varchar(2000),@exesql varchar(3000)
declare @tmpSrcKey varchar(2000),@tmpDesKey varchar(2000)
declare @i int
select @str = 'abcdefghijk ',-- 待搜索的字符串表达式集合
@srcKey = 'acegik ',-- 待查找的字符串表达式集合
@desKey = 'XYZNPQ ',-- 替换用的字符串表达式集合
@tmpSrcStr = ' ',-- 用于拼接replace表达式
@sql = ' ',-- 拼凑构造出来的SQL
@tmpSrcKey = ' ',-- 待搜索的char
@tmpDesKey = ' '-- 待查找的char
set @i = 1
while (@i <= len(@srcKey))
begin
set @tmpSrcKey = substring(@srcKey,@i,1)
set @tmpDesKey = substring(@desKey,@i,1)
if @i = 1
-- 第一次要构造形如:replace( 'abcd ', 'b ', 'x ')
set @tmpSrcStr = @tmpSrcStr + 'replace( ' ' ' + @str + ' ' ', ' ' ' + @tmpSrcKey + ' ' ', ' ' ' + @tmpDesKey + ' ' ') '
else
-- 后面的要构造形如:replace(replace( 'abcd ', 'b ', 'x '), 'd ', 'x ') ,内层的【replace( 'abcd ', 'b ', 'x ')】作为一个整体
set @tmpSrcStr = @tmpSrcStr + 'replace( ' + @str + ', ' ' ' + @tmpSrcKey + ' ' ', ' ' ' + @tmpDesKey + ' ' ') '
print '第 ' + cast(@i as varchar(20)) + '次拼接 @tmpSrcStr = ' + @tmpSrcStr
set @str = @tmpSrcStr -- 每次都拼凑一个内层replace
print '@str = ' + @str
set @sql = @str-- 构造一个sql
set @tmpSrcStr = ' '
set @i = @i + 1
print ' '
end
set @exesql = 'print ' + @sql
print '准备执行的语句: ' + @exesql
exec (@exesql)
[解决办法]
declare @a varchar(100),@b varchar(100),@c varchar(100),@y varchar(100)
set @y= ' '
set @a= 'abcdefghijk '
set @b= 'acegik '
set @c= 'XYZNPQ '
select top 100 id=identity(int,1,1) into # from sysobjects
select @y=@y+ case when aa.a=bb.b then bb.c else aa.a end from
(select id, substring(@a,id,1)a from # )aa
left join
(select id, substring(@b,id,1) b,substring(@c,id,1) c from #) bb
on aa.a=bb.b
select @y
drop table #