Как я могу использовать mySQL replace () для замены строк в нескольких записях?


166

У нас есть база данных, в которой есть несколько записей с некоторыми неверными данными в одном столбце, в которых встроенный редактор избежал некоторых вещей, которые не должны были быть исключены, и он разрывает сгенерированные ссылки.

Я хочу выполнить запрос, чтобы заменить плохие символы во всех записях, но не могу понять, как это сделать. Я нашел в replace()функцию в MySQL, но как я могу использовать его в запросе?

Например, какой будет правильный синтаксис, если я захочу заменить строку &lt;на фактическую угловую скобку меньше ( <) во всех записях &lt;в articleItemстолбце? Это может быть сделано в одном запросе (т.е. выбрать и заменить все одним махом), или мне нужно сделать несколько запросов? Даже если это несколько запросов, как я могу использовать replace()для замены значения поля в более чем одной записи?


5
прежде чем что-то делать, убедитесь, что вы сделали резервную копию базы данных. Вы также можете использовать обновление для обновления любого поля.
Мэтт


Ответы:


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
незначительный спор: БОЛЬШОЙ является «>»
Оливье Дюлак

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

Исправлено &lt;с. Вам нужно использовать кодировку &, вот так: &amp;:)
Dan 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_ TABLE ()

НАЧАТЬ

# заменить пробел подчеркиванием

ОБНОВЛЕНИЕ Таблица SET Имя_поля = Replace ( FieldName ,»», "_") , где Имя_поля не равно нулю;

# Удалить точку

Таблица ОБНОВЛЕНИЙ SET FieldName = REPLACE ( FieldName , ".", "") WHERE FieldName не NULL;

#Удалить (

Таблица ОБНОВЛЕНИЙ SET FieldName = REPLACE ( FieldName , "(", "") WHERE FieldName не NULL;

#Удалить )

ОБНОВЛЕНИЕ Таблица SET Имя_поля = Replace ( FieldName , ")", "") , где Имя_поля не равно нулю;

# Поместить или удалить любой символ, который вы хотите

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

КОНЕЦ

Таким образом, вы имеете модульный контроль над таблицей.

Вы также можете обобщить хранимую процедуру, делая ее параметрической с таблицей, чтобы дезинфицировать входной параметр


1
эти нулевые проверки являются избыточными
kiedysktos

Существуют ли простые и безопасные инструменты для создания хранимых процедур mysql?
Иван Слотер

0

Это поможет вам.

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

Результат:

title = Elmer's Parade
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.