2011-05-10 105 views
411

我有一个包含URL的列(ID,网址):MySQL的字符串替换

http://www.example.com/articles/updates/43 
http://www.example.com/articles/updates/866 
http://www.example.com/articles/updates/323 
http://www.example.com/articles/updates/seo-url 
http://www.example.com/articles/updates/4?something=test 

我想改变单词“更新”,以“新闻”。是否可以用脚本来做到这一点?

+1

[中MySql可能的复制 - 路更新部分字符串?](http://stackoverflow.com/questions/1876762/mysql-way-to-update-portion-of-a-string) – 2016-08-02 14:03:36

回答

983
UPDATE your_table 
SET your_field = REPLACE(your_field, 'articles/updates/', 'articles/news/') 
WHERE your_field LIKE '%articles/updates/%' 

当现在

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww'); 
    -> 'WwWwWw.mysql.com' 

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

请注意,这是更容易,如果你做的是一个别名像

http://www.example.com/articles/updates/43

http://www.example.com/articles/news/43

http://www.electrictoolbox.com/mysql-find-replace-text/

+18

快速问题,真的需要有“WHERE”子句吗? – 2013-07-17 08:08:31

+42

@JohnCrawford根据链接中的文章:“您不一定必须在末尾添加WHERE LIKE'子句,因为如果要查找的文本不存在,该行将不会更新,**但它应该加速**。“ – Giraldi 2013-07-17 12:02:58

+3

WHERE子句为您提供了对被替换内容的具体控制。 如果找到匹配项,将不会检查每一行,并可能会更换数据。 – Carlton 2014-09-11 10:53:15

12

replace函数应该为你工作。

REPLACE(str,from_str,to_str) 

返回字符串str,其中所有出现的字符串from_str都被字符串to_str替换。当搜索from_str时,REPLACE()执行区分大小写的匹配。

126

是,MySQL有一个REPLACE()功能:使用SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url.... 
+0

只要OP的'更新'只显示一次在字符串中,那么这将工作。否则,你会被直接的字符串操作困住,这在MySQL中是非常痛苦的。在这一点上,编写一次性脚本来选择字段,在客户端进行操作,然后回写会更容易。 – 2011-05-10 22:07:33

6

除了gmaggio的回答,如果你需要动态REPLACEUPDATE根据另一列例如,你可以这样做:

UPDATE your_table t1 
INNER JOIN other_table t2 
ON t1.field_id = t2.field_id 
SET t1.your_field = IF(LOCATE('articles/updates/', t1.your_field) > 0, 
REPLACE(t1.your_field, 'articles/updates/', t2.new_folder), t1.your_field) 
WHERE... 

在我的示例中,字符串articles/news/存储在other_table t2中,并且在WHERE子句中不需要使用LIKE

1

您可以简单地使用替代()函数,

与在保留制度

update tabelName set columnName=REPLACE(columnName,'from','to') where condition; 

没有在那里保留制度

update tabelName set columnName=REPLACE(columnName,'from','to'); 

注:以上查询,如果用于更新记录直接在表中,如果你想在选择查询和数据不应该在表的影响则可以使用下面的查询 -

select REPLACE(columnName,'from','to') as updateRecord;