在MySQL中更改/更新字符串的一部分

时间:2013-08-22 10:19:54

标签: mysql sql sql-update string-concatenation

抱歉我的英语不好。 我需要在('before')表中更改表ifns_code中某些行的字符串部分:

name  fio
3301 <a href="127.0.0.1/Users/Profile/lrm" title="LRM (1641)"><img src="../images/staff.ico">3301</img></a>  
3302 <a href="127.0.0.1/Users/Profile/lrm" title="LRM (1641)"><img src="../images/staff.ico">3302</img></a>  
3303 <a href="127.0.0.1/Users/Profile/uaa" title="uaa (1600)"><img src="../images/staff.ico">3303</img></a>  
5007 <a href="127.0.0.1/Users/Profile/uaa" title="uaa (1600)"><img src="../images/staff.ico">5007</img></a>  
5004 <a href="127.0.0.1/Users/Profile/meal" title="meal (1570)"><img src="../images/staff.ico">5004</img></a>

to('after'):

name fio
3301 <a href="127.0.0.1/Users/Profile/lrm" title="LRM (1641)"><img src="../images/staff.ico">3301</img></a>  
3302 <a href="127.0.0.1/Users/Profile/lrm" title="LRM (1641)"><img src="../images/staff.ico">3302</img></a>  
3303 <a href="127.0.0.1/Users/Profile/lrm" title="LRM (1641)"><img src="../images/staff.ico">3303</img></a>  
5007 <a href="127.0.0.1/Users/Profile/lrm" title="LRM (1641)"><img src="../images/staff.ico">5007</img></a>  
5004 <a href="127.0.0.1/Users/Profile/lrm" title="LRM (1641)"><img src="../images/staff.ico">5004</img></a>  

换句话说: 我需要一个sql查询,它只更改所选记录中字符串的一部分:

where 'name' in ('3303','5007','5004')

变化:

<a href="https://127.0.0.1/Users/Profile/**!!!**" title="**!!!**">

为:

<a href="https://127.0.0.1/Users/Profile/lrm"" title="LRM (1641)">

没有接触到这部分字符串:

<img src="../images/staff.ico">**!!!**</img></a>

我正在尝试使用SUBSTRING_INDEX和CONCAT,但我对sql查询的了解并不好。

1 个答案:

答案 0 :(得分:0)

尝试

UPDATE ifns_code INNER JOIN
( SELECT name n, REPLACE(fio,'**!!!**</img>','**???**</img>') f FROM ifns_code ) t ON n=name
SET ifns_code.fio=REPLACE(REPLACE(f,'**!!!**',code),'**???**',name)

这将执行两个替换操作,首先是三个字母代码(我的名字我不知道,我使用code作为名称),然后是name。如果您想让最后一个**!!!**实例保持原样,只需将name替换为外**!!!**函数中的REPLACE

修改

现在,清楚地描述您想要的内容,我可以为您提供所需的UPDATE声明:

UPDATE ifns_code INNER JOIN (
  SELECT name n,instr(fio,'Profile/') i,instr(fio,'"><img') j FROM ifns_code 
) tbl ON n=name 
SET fio=CONCAT(substring(fio,1,i+7),
               'lrm" title="LRM (1641)',
               substring(fio,j))
WHERE name IN ('3303','5007','5004')

点击此处观看直播演示:http://sqlfiddle.com/#!8/3c1a4/1

在派生表表达式中,我计算了我想要改变的字符串部分之前的位置(i)和之后的位置(j)。剩下的只是substringconcat的组合。