สตริง MySQL แทนที่


559

ฉันมีคอลัมน์ที่มี 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

ฉันต้องการเปลี่ยนคำว่า "อัปเดต" เป็น "ข่าว" เป็นไปได้ไหมที่จะทำสิ่งนี้กับสคริปต์?


คำตอบ:


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

ตอนนี้แถวที่เป็นเช่นนั้น

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

จะ

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

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


23
คำถามด่วนจำเป็นต้องมีประโยค "WHERE" จริงหรือไม่
John Crawford

55
@JohnCrawford อ้างอิงจากบทความในการเชื่อมโยง: "คุณไม่จำเป็นต้องมีการเพิ่มWHERE LIKEข้อที่สิ้นสุดเพราะถ้าข้อความที่จะหาไม่ได้มีแถวที่จะไม่ได้รับการปรับปรุงแต่มันควรจะเร็วขึ้น "
Giraldi

3
WHERE clause ให้คุณควบคุมเฉพาะสิ่งที่ถูกแทนที่ จะไม่มีการตรวจสอบทุกแถวและข้อมูลอาจถูกแทนที่หากพบการแข่งขัน
คาร์ลตัน

11
ฉันเชื่อในกรณีนี้ WHERE ไร้ประโยชน์เพราะ a LIKE '%%'ไม่ได้ใช้ดัชนีใด ๆ หากมีส่วนอื่น ๆ ในที่นั้นตัวอย่างเช่นสิ่งที่date_added > '2014-07-01'อาจช่วยได้
Fabrizio

13
ฉันมักจะมาที่นี่เพื่ออ้างอิงเมื่อฉันต้องการแทนที่บางสิ่งบางอย่างใน mysql
Daniel Pecher

141

ใช่ MySQL มีฟังก์ชั่น 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

โปรดทราบว่าจะง่ายกว่าถ้าคุณสร้างชื่อแทนเมื่อใช้ SELECT

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

ตราบใดที่ OP updatesแสดงขึ้นเพียงครั้งเดียวในสตริงดังนั้นสิ่งนี้จะใช้ได้ ไม่เช่นนั้นคุณจะติดกับการจัดการสตริงโดยตรงซึ่งเป็นความเจ็บปวดที่แท้จริงใน MySQL ณ จุดนี้มันจะง่ายกว่าที่จะเขียนสคริปต์แบบครั้งเดียวเพื่อเลือกฟิลด์การจัดการในไคลเอนต์แล้วเขียนกลับ
Marc B

20

เปลี่ยนฟังก์ชั่นควรจะทำงานให้คุณ

REPLACE(str,from_str,to_str)

ส่งคืนสตริง str ที่เกิดขึ้นทั้งหมดของสตริง from_str แทนที่ด้วยสตริง to_str REPLACE()ดำเนินการจับคู่ตามตัวพิมพ์ใหญ่ - เล็กเมื่อค้นหา from_str


9

คุณสามารถใช้ฟังก์ชั่น replace ()

กับที่ข้อ -

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

ไม่มีที่ข้อ -

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

หมายเหตุ: แบบสอบถามด้านบนหากบันทึกการปรับปรุงโดยตรงในตารางถ้าคุณต้องการเลือกแบบสอบถามและข้อมูลไม่ควรได้รับผลกระทบในตารางจากนั้นสามารถใช้แบบสอบถามต่อไปนี้

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

6

นอกจากคำตอบของ gmaggioหากคุณต้องการแบบไดนามิกREPLACEและUPDATEตามคอลัมน์อื่นคุณสามารถทำได้เช่น:

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

ในตัวอย่างของฉันสตริงarticles/news/จะถูกเก็บไว้ในother_table t2และไม่จำเป็นต้องใช้LIKEในWHEREข้อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.