Thay thế chuỗi MySQL


560

Tôi có một cột chứa url (id, url):

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

Tôi muốn thay đổi từ "cập nhật" thành "tin tức". Có thể làm điều này với một kịch bản?


Câu trả lời:


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

Bây giờ các hàng giống như

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

sẽ là

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

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


23
Câu hỏi nhanh, có thực sự cần có mệnh đề "WHERE" không?
John Crawford

55
@JohnCrawford Theo bài viết trong liên kết: "Bạn không nhất thiết phải thêm WHERE LIKEmệnh đề ở cuối, bởi vì nếu văn bản cần tìm không có thì hàng sẽ không được cập nhật, nhưng nó sẽ tăng tốc mọi thứ . "
Giraldi

3
Mệnh đề WHERE cung cấp cho bạn quyền kiểm soát cụ thể đối với những gì được thay thế. Không có một hàng nào sẽ được kiểm tra và có khả năng thay thế dữ liệu nếu tìm thấy kết quả khớp.
Carlton

11
Tôi tin rằng trong trường hợp này, WHERE là vô dụng vì LIKE '%%'không sử dụng bất kỳ chỉ mục nào, nếu có các phần khác trong WHERE, ví dụ như một cái gì đó giống như date_added > '2014-07-01'nó có thể đã giúp đỡ
Fabrizio

13
Tôi luôn đến đây để tham khảo khi tôi cần thay thế một cái gì đó trong mysql
Daniel Pecher

141

Có, MySQL có hàm REPLACE ():

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

http://dev.mysql.com/doc/refman/5.0/en/opes-fifts.html#feft_Vplace

Lưu ý rằng sẽ dễ dàng hơn nếu bạn tạo bí danh khi sử dụng SELECT

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

Miễn là OP updateschỉ xuất hiện một lần trong chuỗi, thì điều này sẽ hoạt động. Nếu không, bạn bị mắc kẹt với thao tác chuỗi trực tiếp, đó là một nỗi đau thực sự trong MySQL. Tại thời điểm đó, việc viết kịch bản một lần sẽ dễ dàng hơn để chọn các trường, thao tác trong máy khách, sau đó viết lại.
Marc B

20

Các chức năng thay thế sẽ làm việc cho bạn.

REPLACE(str,from_str,to_str)

Trả về chuỗi str với tất cả các lần xuất hiện của chuỗi from_str được thay thế bằng chuỗi to_str. REPLACE()thực hiện một trận đấu phân biệt chữ hoa chữ thường khi tìm kiếm from_str.


9

Bạn chỉ có thể sử dụng hàm thay thế (),

với mệnh đề-

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

không có mệnh đề-

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

Lưu ý: Truy vấn trên nếu để cập nhật các bản ghi trực tiếp trong bảng, nếu bạn muốn chọn truy vấn và dữ liệu không bị ảnh hưởng trong bảng thì có thể sử dụng truy vấn sau-

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

6

Ngoài câu trả lời của gmaggio nếu bạn cần động REPLACEUPDATEtheo một cột khác, bạn có thể làm ví dụ:

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...

Trong ví dụ của tôi, chuỗi articles/news/được lưu trữ trong other_table t2và không cần sử dụng LIKEtrong WHEREmệnh đề.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.