ทำไมคำสั่ง UPDATE SET REPLACE () จะจับคู่แถว แต่ไม่เปลี่ยนเลยและไม่มีคำเตือน?


9

ฉันกำลังค้นหาสตริงที่แน่นอนในเขตข้อมูลและต้องการแทนที่ด้วยสตริงใหม่ โดยเฉพาะฉันต้องการให้การอ้างอิงทั้งหมดไปยัง URL หนึ่งเปลี่ยนเป็น URL อื่น ฉันได้สร้างคำสั่ง SQL นี้ขึ้นและกำลังเรียกใช้งานที่mysql>พรอมต์ของ CentOS 5.5 โดยใช้ MySQL Community Server 5.1.54

update [table] set [field] = REPLACE([field],'%domain.com%','%domain.org%');

คำตอบคือ:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 618  Changed: 0  Warnings: 0

ฉันจะติดตามสาเหตุที่ไม่มีการเปลี่ยนแปลงได้อย่างไร

แก้ไข 1:

ขอบคุณ Aaron Bertrand ฉันค้นพบว่าREPLACE()ไม่สามารถจัดการสัญลักษณ์แทนได้และฉันใช้ผิดทั้งหมด (คิดว่า: WHEREclause หายไป) นี่คือคำแถลงการปฏิรูปของฉัน:

UPDATE [table]
SET [column] =
REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )
WHERE
    [column]
LIKE
    '%companydomain.com%';

ที่ฉันได้รับเก่าคุ้นเคย:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 167  Changed: 0  Warnings: 0

ฉันทำอะไรผิดได้

แก้ไข 2:

ฉันจะบอกสิ่งที่ฉันทำผิด !! ฉันไม่ได้ตั้งสมมติฐาน ข้อสันนิษฐานของฉันคือสตริงที่ฉันแทนที่อยู่ในตัวพิมพ์เล็กทั้งหมด LIKE %companydomain.com%ข้อที่กำลังจะกลับทุกสิ่งที่ดู ซึ่งรวมถึงการเปลี่ยนรูปแบบตัวพิมพ์ใหญ่ทั้งหมดเช่น CompanyDomain.com, CoMpAnYdOmAiN.com และอื่น ๆ

ส่งผ่านสิ่งนั้นไปREPLACE()หา companydomain.com อย่างเคร่งครัดเพื่อแทนที่มันด้วย companydomain.org

REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )

แน่นอนว่าบันทึกของฉันถูกส่งคืน แต่ไม่มีอะไรถูกแทนที่ เมื่อฉันเปลี่ยนREPLACE()ให้คำนึงถึงการใช้อักษรตัวพิมพ์ใหญ่แล้วบันทึกทั้งหมดจะได้รับการอัปเดตและปรากฏว่าทุกอย่างเป็นไปด้วยดี REPLACE()ไวยากรณ์ที่ถูกต้องสำหรับสถานการณ์ของฉันจึง:

REPLACE (
    [column],
    'CompanyDomain.com',
    'companydomain.org' )

คำตอบ:


12

REPLACEไม่เล่นด้วย wildcards ในลักษณะนั้น ฉันคิดว่าคุณหมายถึง:

UPDATE [table] 
  SET [column] = REPLACE([column],'TLD.com','TLD.org')
  WHERE [column] LIKE '%TLD.com%';

คุณไม่มีWHEREส่วนคำสั่งดังนั้นจึงพยายามอัปเดตแถว 618 แถว แต่ไม่พบอินสแตนซ์ของ%TLD.com%ในคอลัมน์นั้น หากต้องการดูว่าแถวไหนควรได้รับผลกระทบให้เรียกใช้ a SELECT:

SELECT [column], REPLACE([column], 'TLD.com', 'TLD.org') AS new_value
  FROM [table]
  WHERE [column] LIKE '%TLD.com%';

0

อันดับแรกเราต้องตรวจสอบโดยใช้selectแบบสอบถาม:

SELECT * FROM colleges
WHERE course_name LIKE '%&amp%'

ต่อไปเราต้องอัปเดต:

UPDATE colleges
SET course_name = REPLACE(course_name, '&amp', '&')
WHERE id = 1

ผลลัพธ์: Cloud &amp Enterprise ComputingCloud & Enterprise Computing

สุดท้ายเราต้องสมัครทั้งหมด:

UPDATE colleges
SET course_name = REPLACE(course_name, '&amp', '&')

ผลลัพธ์: Corporate &amp Insolvency LawCorporate & Insolvency Law

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