ฉันจะใช้ mySQL replace () เพื่อแทนที่สตริงในหลาย ๆ ระเบียนได้อย่างไร


166

เรามีฐานข้อมูลที่มีเรคคอร์ดจำนวนมากโดยมีข้อมูลไม่ดีในคอลัมน์เดียวซึ่งเอดิเตอร์แบบฝังหนีข้อมูลบางอย่างที่ไม่ควรหลีกเลี่ยงและทำลายลิงค์ที่สร้างขึ้น

ฉันต้องการเรียกใช้คิวรีเพื่อแทนที่อักขระที่ไม่ดีในระเบียนทั้งหมด แต่ไม่สามารถหาวิธีทำได้ ผมพบว่าฟังก์ชั่นใน MySQL แต่วิธีการที่ฉันสามารถใช้งานได้ภายในแบบสอบถาม?replace()

ตัวอย่างเช่นอะไรจะเป็นไวยากรณ์ที่ถูกต้องหากฉันต้องการแทนที่สตริง&lt;ด้วยวงเล็บเหลี่ยมมุมน้อยกว่าจริง ( <) ในบันทึกทั้งหมดที่มี&lt;ในarticleItemคอลัมน์? มันสามารถทำได้ในแบบสอบถามเดียว (เช่นเลือกและแทนที่ทั้งหมดในหนึ่ง swoop) หรือฉันจะต้องทำหลายแบบสอบถาม? แม้ว่าจะมีหลายแบบสอบถามฉันreplace()จะใช้เพื่อแทนที่ค่าของเขตข้อมูลในมากกว่าหนึ่งระเบียนได้อย่างไร


5
ก่อนที่คุณจะทำอะไรให้แน่ใจว่าคุณสำรองฐานข้อมูลด้วย คุณจะใช้การอัปเดตเพื่ออัปเดตฟิลด์ใด ๆ
แมตต์


ซ้ำซ้อนที่เป็นไปได้ของการค้นหา MySQL และแทนที่ข้อความในฟิลด์
zgormez

คำตอบ:


395

ในระดับทั่วไปมาก

UPDATE MyTable

SET StringColumn = REPLACE (StringColumn, 'SearchForThis', 'ReplaceWithThis')

WHERE SomeOtherColumn LIKE '%PATTERN%'

ในกรณีของคุณคุณบอกว่าสิ่งเหล่านี้ถูกหลบหนี แต่เนื่องจากคุณไม่ได้ระบุวิธีที่พวกเขาหลบหนีมาสมมติว่าพวกเขาหลบหนีไป GREATERTHAN

UPDATE MyTable

SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>')

WHERE articleItem LIKE '%GREATERTHAN%'

เนื่องจากเคียวรีของคุณกำลังทำงานอยู่ภายในสตริงWHEREส่วนคำสั่งที่ตรงกับรูปแบบของคุณจึงไม่น่าจะปรับปรุงประสิทธิภาพใด ๆ - จริงๆแล้วมันจะสร้างงานให้กับเซิร์ฟเวอร์ได้มากขึ้น ถ้าคุณไม่มีสมาชิกส่วนคำสั่ง WHERE อื่นที่จะทำให้แบบสอบถามนี้ทำงานได้ดีขึ้นคุณสามารถทำการอัปเดตดังนี้:

UPDATE MyTable
SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>')

คุณยังสามารถซ้อนการREPLACEโทรหลายสายได้

UPDATE MyTable
SET StringColumn = REPLACE (REPLACE (StringColumn, 'GREATERTHAN', '>'), 'LESSTHAN', '<')

คุณสามารถทำสิ่งนี้ได้เมื่อคุณเลือกข้อมูล (ตรงข้ามกับเมื่อคุณบันทึกข้อมูล)

ดังนั้นแทนที่จะ:

SELECT MyURLString From MyTable

คุณสามารถทำได้

SELECT REPLACE (MyURLString, 'GREATERTHAN', '>') as MyURLString From MyTable


7
เล่นลิ้นเล็กน้อย: GREATERTHAN คือ '>'
Olivier Dulac

23
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')

แก้ไข&lt;s คุณจำเป็นต้องใช้การเข้ารหัสของและเช่นดังนั้น: &amp;:)
แดน J

ฉันแก้ไขอีกครั้ง ขอบคุณสำหรับการให้ฉันรู้ว่า. มันเกิดขึ้นกับฉันหลังจากที่ฉันบอกว่าไม่รู้ นั่นเป็นวิธีที่โลกของฉันทำงาน :)
simshaun

6

ตรวจสอบสิ่งนี้

UPDATE some_table SET some_field = REPLACE("Column Name/String", 'Search String', 'Replace String')

เช่นกับสตริงตัวอย่าง:

UPDATE some_table SET some_field = REPLACE("this is test string", 'test', 'sample')

EG พร้อมชื่อคอลัมน์ / ฟิลด์:

UPDATE some_table SET some_field = REPLACE(columnName, 'test', 'sample')

4

คุณสามารถเขียนขั้นตอนการจัดเก็บเช่นนี้:

สร้างขั้นตอน sanitize_ ตาราง ()

เริ่ม

#replace พื้นที่ที่มีเครื่องหมายขีดล่าง

UPDATE ตาราง SET FieldName = แทนที่ ( FieldName "", "_") ซึ่งFieldNameไม่ใช่ NULL;

#delete dot

UPDATE ตาราง SET FieldName = REPLACE ( FieldName , ".", "") WHERE ที่FieldNameไม่ใช่ NULL;

#ลบ (

UPDATE ตาราง SET FieldName = REPLACE ( FieldName , "(", "") WHERE FieldNameไม่เป็น NULL;

#ลบ )

UPDATE ตาราง SET FieldName = REPLACE ( FieldName , ")", "") WHERE ที่FieldNameไม่เป็น NULL;

#raplace หรือลบอักขระที่คุณต้องการ

# ..........................

END

ด้วยวิธีนี้คุณสามารถควบคุมตารางแบบโมดูลาร์ได้

นอกจากนี้คุณยังสามารถวางขั้นตอนทั่วไปที่เก็บไว้ทำพารามิเตอร์กับตารางเพื่อป้อนพารามิเตอร์ sanitoze


1
การตรวจสอบโมฆะเหล่านี้ซ้ำซ้อน
kiedysktos

มีเครื่องมือที่ง่ายและปลอดภัยในการสร้างโพรซีเดอร์ที่เก็บ mysql หรือไม่?
Ivan Slaughter

0

สิ่งนี้จะช่วยคุณ

UPDATE play_school_data SET title= REPLACE(title, "&#39;", "'") WHERE title = "Elmer&#39;s Parade";

ผลลัพธ์:

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