日期:2014-05-18  浏览次数:20402 次

------------一个字符串截取问题-------------------

729从J075703(1400)&J074457(280)&J071234(280)转出
728从J075703转出
729从J075703转出
721从J074457(160)&J075703(6560)转出
729从J075703(18480)转出
829从J076081(1080)&J075703(600)转出

在一个表某字段中有如上6行记录,这个记录中包含了很多 7 位长的编号。
现在我要将这些文本中的编号升级,升级为10位长的编号。

升级的规则是:从编号的右边开始找,找到不是数字的时候就加入三个零。

上面这六行记录升级后的结果应该如下:
729周从J000075703(1400)&J000074457(280)&J000071234(280)转出
728周从J000075703转出
729周从J000075703转出
721周从J000074457(160)&J000075703(6560)转出
729周从J000075703(18480)转出
829周从J000076081(1080)&J000075703(600)转出


  请问用SQL语句怎么实现啊???


------解决方案--------------------
update tb
set col=replace(col,'J0','J0000')
------解决方案--------------------
TRY:
SQL code

update 表 set 字段=replace(字段,'J','J000')

------解决方案--------------------
探讨

升级的规则是:从编号的右边开始往左边找,找到第一个不是数字的时候就加入三个零。

------解决方案--------------------
探讨
@liangCK
@libin_ftsafe
实际中的数据不一定全部是J0开头的哦。

@fcuandy
就是找到不是数字时,就在这个字母后面加上三个零。
如下例子:
729从Ja75703(1400)&Jy74457(280)&Jhh1234(280)转出
728从Jkkk003转出
------
升级后应该为(红色为升级加进去的三个0):
729从Ja00075703(1400)&Jy00074457(280)&Jhh0001234(280)转出
728从Jkkk000003转出

------解决方案--------------------
需要写个函数或循环.
实现这个功能用正则的话,效率就差了.
------解决方案--------------------
SQL code

--创建函数:
create function wsp(@sql varchar(8000))
returns @val varchar(8000)
begin
    set @val=''
    while(charindex('从',@sql)>0 or charindex('&',@sql)>0 )
    begin
        if(charindex('从',@sql)<charindex('&',@sql) and charindex('从',@sql)>0)
        begin
            set @val=@val+left(@sql,charindex('从',@sql))
            set @sql=substring(@sql,charindex('从',@sql)+1,len(@sql))
            set @sql=stuff(@sql,patindex('%[0-9]%',@sql),0,'000')
        end
        else
        begin
            set @val=@val+left(@sql,charindex('&',@sql))
            set @sql=substring(@sql,charindex('&',@sql)+1,len(@sql))
            set @sql=stuff(@sql,patindex('%[0-9]%',@sql),0,'000')
        end
    end
    return @val+@sql
end

--调用函数修改:
update 表名 set 字段=dbo.wsp(字段)

------解决方案--------------------