Як я можу використовувати mySQL substitute () для заміни рядків у кількох записах?


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
незначна приказка: GREATERTHAN - '>'
Олів'є Дулак

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

Виправлено &lt;s. Вам потрібно використовувати кодування &, як-от так: &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

ви можете записати збережену процедуру так:

CREATE PROCEDURE sanitize_ TABLE ()

ПОЧАТОК

# замініть пробіл з підкресленням

UPDATE таблиця SET FieldName = ЗАМІНА ( FieldName , "", "_") WHERE FieldName не NULL;

#delete точка

ОНОВЛЕННЯ Таблиця SET FieldName = ЗАМІНА ( FieldName , ".", "") WHERE FieldName не NULL;

#delete (

ОНОВЛЕННЯ Таблиця SET FieldName = ЗАМІНА ( FieldName , "(", "") WHERE FieldName не NULL;

#delete)

ОНОВЛЕННЯ Таблиця SET FieldName = ЗАМІНА ( FieldName , ")", "") WHERE FieldName не NULL;

# замініть або видаліть будь-яку потрібну діаграму

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

Кінець

Таким чином ви маєте модульований контроль над таблицею.

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



Чи є легкі та безпечні інструменти для створення 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.