MySQL mencari dan mengganti beberapa teks dalam suatu bidang

257

Apa permintaan MySQL yang akan melakukan pencarian dan penggantian teks dalam satu bidang tertentu dalam sebuah tabel?

Yaitu mencari foodan mengganti dengan barbegitu catatan dengan bidang dengan nilai hello foomenjadi hello bar.

julz
sumber

Jawaban:

490

Ubah table_namedan fielduntuk mencocokkan nama tabel dan bidang Anda dalam pertanyaan:

UPDATE table_name SET field = REPLACE(field, 'foo', 'bar') WHERE INSTR(field, 'foo') > 0;
Joe Skora
sumber
79
UPDATE [table_name] SET [field_name] = REPLACE ( [field_name], "foo", "bar");
Meetai.com
6
Saya pikir lebih cepat tidak menggunakan WHERE instr(field, 'foo') > 0;(jadi tidak akan melakukan 2 pencarian) ... Apakah saya salah?
inemanja
2
@treddell, tidak ada posisi mulai dari 1 di string SQL.
Alexis Wilke
2
@inemanja, @Air tanpa WHEREklausa yang Anda lakukan UPDATEpada semua baris ...
Alexis Wilke
7
Seperti Pring, jika Anda akan meninggalkan komentar seperti itu, Anda mungkin ingin menjelaskan alasannya. Apakah itu kesalahan dalam saran awal, atau kesalahan di pihak Anda? Dan Anda tahu bahwa sebelum Anda melakukan perubahan besar pada database Anda harus mendukungnya terlebih dahulu?
pdwalker
86
UPDATE table_name 
SET field = replace(field, 'string-to-find', 'string-that-will-replace-it');
cetakan kecil
sumber
2
Membantuku. Untuk semua noobs, harap hapus tanda kurung siku.
Anantha Raju C
8
 UPDATE table SET field = replace(field, text_needs_to_be_replaced, text_required);

Seperti misalnya, jika saya ingin mengganti semua kemunculan John dengan Mark, saya akan menggunakan di bawah ini,

UPDATE student SET student_name = replace(student_name, 'John', 'Mark');
Umesh Patil
sumber
6

Dan jika Anda ingin mencari dan mengganti berdasarkan nilai bidang lain Anda bisa melakukan CONCAT:

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

Hanya untuk memiliki yang ini di sini sehingga orang lain akan menemukannya sekaligus.

basdog22
sumber
Jika Anda mengutip nama bidang, pastikan Anda menggunakan jenis kutipan yang tepat !
200_success
4

Dalam pengalaman saya, metode tercepat adalah

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

The INSTR()cara adalah tercepat kedua dan menghilangkan WHEREklausul sama sekali adalah yang paling lambat, bahkan jika kolom tidak diindeks.

Gaspy
sumber
Bekerja untuk saya karena saya perlu menambahkan klausa lain di mana. UPDATE table_name SET field = REPLACE (bidang, 'foo', 'bar') MANA bidang SEPERTI '% foo%' DAN otherfield = 'foo22'
Maks.
1

Fungsi Ganti string akan melakukan itu.

Wayne
sumber
Bekerja untukku. Itu tergantung pada bagaimana Anda menafsirkan pertanyaan itu. Jika Anda membutuhkan entri basis data untuk diubah, maka gunakan update. Kalau tidak, solusi ini jauh lebih baik karena dapat digunakan tanpa memperbarui bidang.
Gruber
0

Saya menggunakan baris perintah di atas sebagai berikut: perbarui TABLE-NAME set FIELD = replace (FIELD, 'And', 'and'); tujuannya adalah untuk mengganti Dan dengan dan ("A" harus huruf kecil). Masalahnya adalah ia tidak dapat menemukan "Dan" dalam database, tetapi jika saya menggunakan seperti "% Dan%" maka ia dapat menemukannya bersama dengan banyak ands lainnya yang merupakan bagian dari kata atau bahkan yang sudah huruf kecil.

Schwann
sumber