MySQL tìm kiếm và thay thế một số văn bản trong một lĩnh vực


257

Truy vấn MySQL nào sẽ thực hiện tìm kiếm văn bản và thay thế trong một trường cụ thể trong bảng?

Tức là tìm kiếm foovà thay thế bằng barmột bản ghi với một trường có giá trị hello footrở thành hello bar.

Câu trả lời:


490

Thay đổi table_namefieldđể phù hợp với tên bảng và trường của bạn trong câu hỏi:

UPDATE table_name SET field = REPLACE(field, 'foo', 'bar') WHERE INSTR(field, 'foo') > 0;

79
CẬP NHẬT [tên_bảng] SET [field_name] = REPLACE ( [field_name], "foo", "bar");
Meetai.com

6
Tôi nghĩ rằng nó không nhanh hơn để sử dụng WHERE instr(field, 'foo') > 0;(vì vậy nó sẽ không thực hiện 2 tìm kiếm) ... Tôi có sai không?
inemanja

2
@treddell, không có vị trí nào bắt đầu từ 1 trong chuỗi SQL.
Alexis Wilke

2
@inemanja, @Air không có WHEREđiều khoản bạn thực hiện UPDATEtrên tất cả các hàng ...
Alexis Wilke

7
Giống như Pring, nếu bạn sẽ để lại một bình luận như vậy, bạn có thể muốn giải thích tại sao. Đó có phải là một sai lầm trong lời khuyên ban đầu, hay một lỗi lầm từ phía bạn? Và bạn có biết rằng trước khi bạn thực hiện bất kỳ thay đổi sâu rộng nào đối với cơ sở dữ liệu, bạn phải sao lưu nó trước không?
pdwalker

86
UPDATE table_name 
SET field = replace(field, 'string-to-find', 'string-that-will-replace-it');

2
Đã giúp tôi. Đối với tất cả các noobs, xin vui lòng loại bỏ dấu ngoặc vuông.
Anantha Raju C

8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Ví dụ như, nếu tôi muốn thay thế tất cả các lần xuất hiện của John bằng Mark, tôi sẽ sử dụng bên dưới,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');

6

Và nếu bạn muốn tìm kiếm và thay thế dựa trên giá trị của một lĩnh vực khác, bạn có thể thực hiện CONCAT:

update table_name set `field_name` = replace(`field_name`,'YOUR_OLD_STRING',CONCAT('NEW_STRING',`OTHER_FIELD_VALUE`,'AFTER_IF_NEEDED'));

Chỉ cần có cái này ở đây để những người khác sẽ tìm thấy nó ngay lập tức.



4

Theo kinh nghiệm của tôi, phương pháp nhanh nhất là

UPDATE table_name SET field = REPLACE(field, 'foo', 'bar') WHERE field LIKE '%foo%';

Các INSTR()cách là nhanh nhất thứ hai và bỏ qua các WHEREkhoản hoàn toàn là chậm nhất, thậm chí nếu cột không được lập chỉ mục.


Làm việc cho tôi vì tôi cần thêm một mệnh đề khác. CẬP NHẬT trường tên_bảng SET = REPLACE (trường, 'foo', 'bar') Trường WHERE THÍCH '% foo%' VÀ otherfield = 'foo22'
Tối đa

1

các Thay thế chuỗi sẽ làm điều đó.


Làm việc cho tôi. Nó phụ thuộc vào cách bạn diễn giải câu hỏi. Nếu bạn cần các mục cơ sở dữ liệu để thay đổi, sau đó sử dụng update. Nếu không, giải pháp này tốt hơn nhiều vì nó có thể được sử dụng mà không cần cập nhật các trường.
Gruber

0

Tôi đã sử dụng dòng lệnh trên như sau: update TABLE-NAME set FIELD = thay thế (FIELD, 'And', 'và'); mục đích là để thay thế Và bằng và ("A" nên viết thường). Vấn đề là nó không thể tìm thấy "Và" trong cơ sở dữ liệu, nhưng nếu tôi sử dụng như "% And%" thì nó có thể tìm thấy nó cùng với nhiều từ khác và là một phần của một từ hoặc thậm chí là những từ viết thường.

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.