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?


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/


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

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.


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;

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.