Как я могу использовать mySQL replace () для замены строк в нескольких записях? - PullRequest
160 голосов
/ 24 ноября 2010

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

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

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

Ответы [ 4 ]

379 голосов
/ 24 ноября 2010

На очень общем уровне

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

22 голосов
/ 24 ноября 2010
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')
6 голосов
/ 23 сентября 2014

Отметьте это

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')

Например, имя столбца / поля:

UPDATE some_table SET some_field = REPLACE(columnName, 'test', 'sample')
4 голосов
/ 16 декабря 2015

вы можете написать хранимую процедуру следующим образом:

СОЗДАНИЕ ПРОЦЕДУРЫ sanitize_ ТАБЛИЦА ()

НАЧАТЬ

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

ОБНОВЛЕНИЕ Таблица SET Имя поля = ЗАМЕНА ( Имя поля , "" , "_") WHERE FieldName не равно NULL;

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

ОБНОВЛЕНИЕ Таблица SET Имя поля = ЗАМЕНА ( Имя поля , ". "," ") ГДЕ FieldName не равно NULL;

# удалить (

ОБНОВЛЕНИЕ Таблица SET FieldName = ЗАМЕНА ( FieldName , "( "," ") ГДЕ FieldName не равно NULL;

# удалить)

ОБНОВЛЕНИЕ Таблица SET FieldName = ЗАМЕНА ( FieldName , ") "," ") ГДЕ FieldName не равно NULL;

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

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

END

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...