Làm cách nào tôi có thể sử dụng myQuery thay thế () để thay thế các chuỗi trong nhiều bản ghi?


165

Chúng tôi có một cơ sở dữ liệu có một loạt các bản ghi với một số dữ liệu xấu trong một cột, trong đó một trình soạn thảo nhúng đã thoát một số nội dung không nên thoát và nó phá vỡ các liên kết được tạo.

Tôi muốn chạy truy vấn để thay thế các ký tự xấu trong tất cả các bản ghi, nhưng không thể tìm ra cách thực hiện. Tôi thấy các replace()chức năng trong MySQL, nhưng làm thế nào tôi có thể sử dụng nó bên trong một truy vấn?

Ví dụ, cú pháp chính xác sẽ là gì nếu tôi muốn thay thế chuỗi &lt;bằng một dấu ngoặc góc nhỏ hơn thực tế ( <) trong tất cả các bản ghi có &lt;trong articleItemcột? Nó có thể được thực hiện trong một truy vấn không (nghĩa là chọn và thay thế tất cả trong một swoop), hoặc tôi có phải thực hiện nhiều truy vấn không? Ngay cả khi đó là nhiều truy vấn, làm cách nào để sử dụng replace()để thay thế giá trị của một trường trên nhiều bản ghi?


5
trước khi bạn làm bất cứ điều gì hãy chắc chắn rằng bạn cũng sao lưu cơ sở dữ liệu. Bạn cũng sẽ sử dụng cập nhật để cập nhật bất kỳ lĩnh vực.
Matt


Câu trả lời:


394

Ở cấp độ rất chung chung

UPDATE MyTable

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

WHERE SomeOtherColumn LIKE '%PATTERN%'

Trong trường hợp của bạn, bạn nói rằng những thứ này đã được trốn thoát nhưng vì bạn không chỉ định cách chúng được trốn thoát, hãy nói rằng chúng đã được trốn thoát GREATERTHAN

UPDATE MyTable

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

WHERE articleItem LIKE '%GREATERTHAN%'

Vì truy vấn của bạn thực sự sẽ hoạt động bên trong chuỗi, nên WHEREmệnh đề của bạn thực hiện khớp mẫu của nó không có khả năng cải thiện bất kỳ hiệu suất nào - nó thực sự sẽ tạo ra nhiều công việc hơn cho máy chủ. Trừ khi bạn có một thành viên mệnh đề WHERE khác sẽ làm cho truy vấn này hoạt động tốt hơn, bạn chỉ cần thực hiện cập nhật như sau:

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

Bạn cũng có thể lồng nhiều REPLACEcuộc gọi

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

Bạn cũng có thể làm điều này khi bạn chọn dữ liệu (trái ngược với khi bạn lưu nó).

Vì vậy, thay vì:

SELECT MyURLString From MyTable

Bạn có thể làm

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


7
ngụy biện nhỏ: TUYỆT VỜI là '>'
Olivier Dulac

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

Cố định các &lt;s. Bạn cần sử dụng mã hóa của &, như vậy: &amp;:)
Dan J

Tôi chỉnh sửa lại nó. Cảm ơn vì đã cho tôi biết. Tôi chợt nhận ra những khoảnh khắc sau khi tôi nói rằng tôi không biết làm thế nào. Đó là cách thế giới của tôi hoạt động. :)
simshaun

6

Kiểm tra điều này

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

Ví dụ với chuỗi mẫu:

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

EG với Cột / Tên trường:

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

4

bạn có thể viết một thủ tục được lưu trữ như thế này:

TẠO QUY TRÌNH vệ sinh_ BẢNG ()

BẮT ĐẦU

#replace không gian với dấu gạch dưới

CẬP NHẬT Bảng SET FieldName = REPLACE ( FieldName , "", "_") WHERE FieldName không phải là NULL;

# chấm chấm

CẬP NHẬT Bảng SET FieldName = REPLACE ( FieldName , ".", "") WHERE FieldName không phải là NULL;

#xóa bỏ (

CẬP NHẬT Bảng SET FieldName = REPLACE ( FieldName , "(", "") WHERE FieldName không phải là NULL;

#xóa bỏ )

CẬP NHẬT Bảng SET FieldName = REPLACE ( FieldName , ")", "") WHERE FieldName không phải là NULL;

#raplace hoặc xóa bất kỳ char nào bạn muốn

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

KẾT THÚC

Theo cách này, bạn có điều khiển mô-đun trên bảng.

Bạn cũng có thể khái quát hóa thủ tục được lưu trữ, làm tham số với bảng để sanitoze tham số đầu vào


1
những kiểm tra null là không cần thiết
kiedysktos 28/03/2017

Có bất kỳ công cụ dễ dàng và an toàn để tạo thủ tục lưu trữ mysql không?
Ivan Sl tàn

0

Điều này sẽ giúp bạn.

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

Kết quả:

title = Elmer's Parade
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.