Ganti string MySQL

560

Saya memiliki kolom yang berisi 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

Saya ingin mengubah kata "pembaruan" menjadi "berita". Apakah mungkin melakukan ini dengan skrip?

n00b
sumber
2
Kemungkinan duplikat MySql - Cara memperbarui sebagian string?
Steve Chambers

Jawaban:

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

Sekarang baris itu seperti

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

akan

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

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

Giraldi
sumber
23
Pertanyaan singkat, apakah benar-benar diperlukan untuk memiliki klausa "DI MANA"?
John Crawford
55
@JohnCrawford Menurut artikel di tautan: "Anda tidak harus menambahkan WHERE LIKEklausa di bagian akhir, karena jika teks yang ditemukan tidak ada, baris tidak akan diperbarui, tetapi harus mempercepatnya . "
Giraldi
3
Klausa WHERE memberi Anda kendali spesifik atas apa yang akan diganti. Tanpa satu setiap baris akan diperiksa dan data berpotensi diganti jika kecocokan ditemukan.
Carlton
11
Saya percaya dalam kasus ini WHERE tidak berguna karena a LIKE '%%'tidak menggunakan indeks, jika ada bagian lain di WHERE, misalnya sesuatu seperti date_added > '2014-07-01'itu mungkin membantu
Fabrizio
13
Saya selalu datang ke sini untuk referensi ketika saya perlu mengganti sesuatu di mysql
Daniel Pecher
141

Ya, MySQL memiliki fungsi REPLACE ():

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

Perhatikan bahwa lebih mudah jika Anda membuat alias saat menggunakan SELECT

SELECT REPLACE(string_column, 'search', 'replace') as url....
onteria_
sumber
Selama OP updateshanya muncul sekali dalam string, maka ini akan berhasil. Kalau tidak, Anda terjebak dengan manipulasi string langsung yang merupakan rasa sakit nyata di MySQL. Pada titik itu akan lebih mudah untuk menulis skrip satu kali untuk memilih kolom, memanipulasi klien, lalu menulis kembali.
Marc B
20

Fungsi ganti harus bekerja untuk Anda.

REPLACE(str,from_str,to_str)

Mengembalikan string str dengan semua kemunculan string from_str digantikan oleh string to_str. REPLACE()melakukan pencocokan case-sensitive saat mencari from_str.

Jay
sumber
9

Anda cukup menggunakan fungsi replace (),

dengan mana klausa-

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

tanpa mana klausa-

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

Catatan: Permintaan di atas jika untuk memperbarui catatan langsung dalam tabel, jika Anda ingin pilih permintaan dan data tidak boleh terpengaruh dalam tabel maka dapat menggunakan permintaan berikut-

select REPLACE(columnName,'from','to') as updateRecord;
Deepak Kumbhar
sumber
6

Selain jawaban gmaggio jika Anda perlu secara dinamis REPLACEdan UPDATEmenurut kolom lain yang dapat Anda lakukan misalnya:

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

Dalam contoh saya, string articles/news/disimpan di other_table t2dan tidak perlu digunakan LIKEdalam WHEREklausa.

RafaSashi
sumber