В процессе исправления плохо импортированной базы данных с проблемами, вызванными использованием неправильной кодировки базы данных или чем-то в этом роде.
В любом случае, возвращаясь к моему вопросу, чтобы исправить эти проблемы, я использую запрос этой формы:
UPDATE
table_nameSET field_name = replace(field_name,’search_text’,'replace_text’);
Таким образом, если таблица, над которой я работаю, имеет несколько столбцов, я должен вызвать этот запрос для каждого из столбцов. Кроме того, поскольку существует не только одна пара вещей для запуска поиска и замены, я также должен вызывать запрос для каждой из этих пар.
Как вы понимаете, я выполняю десятки запросов, чтобы исправить одну таблицу.
Мне было интересно, есть ли способ объединить несколько операций поиска и замены в одном запросе, например, например, искать этот набор вещей и, если они найдены, заменить на соответствующую пару из этого другого набора вещей.
Или, если бы был способ сделать запрос формы, которую я показал выше, для выполнения рекурсивно для каждого столбца таблицы, независимо от их имени или номера.
Спасибо заранее за вашу поддержку, титул


Я не знаю, как автоматически запускать поиск и замену в каждом столбце, однако проблема нескольких пар условий поиска и замены в одном запросе UPDATE легко решается вложенными вызовами replace():
UPDATE table_name SET field_name =
replace(
replace(
replace(
field_name,
'foo',
'bar'
),
'see',
'what',
),
'I',
'mean?'
)
Давайте попробуем разобраться с каждым из них по отдельности:
Если набор замен одинаков для каждого столбца в каждой таблице, в которой вам нужно это сделать (или есть только пара шаблонов), рассмотрите возможность создания пользовательской функции, которая принимает varchar и возвращает varchar, который просто вызывает replace(replace(@input,'search1','replace1'),'search2','replace2') вложены по мере необходимости.
Чтобы обновить несколько столбцов одновременно, у вас должна быть возможность сделать UPDATE table_name SET field_name1 = replace(field_name1,...), field_name2 = replace(field_name2,...) или что-то подобное.
Что касается запуска чего-то подобного для каждого столбца в каждой таблице, я бы подумал, что было бы проще написать код, который извлекает список столбцов и генерирует запросы для выполнения из него.
Если у вас есть несколько замен различного текста в одном поле, я рекомендую вам создать таблицу с текущими значениями и тем, чем вы хотите их заменить. (Это может быть какая-то временная таблица, если это разовая сделка; если нет, сделайте ее постоянной.) Затем присоединитесь к этой таблице и выполните обновление.
Что-то вроде:
update t1
set field1 = t2.newvalue
from table1 t1
join mycrossreferncetable t2 on t1.field1 = t2.oldvalue
Извините, я не заметил, что это MySQL, код - это то, что я бы использовал в SQL Server, мой синтаксис SQL может быть другим, но техника будет аналогичной.
Я написал хранимую процедуру, которая делает это. Я использую это на уровне каждой базы данных, хотя было бы легко абстрагироваться от него, чтобы он работал глобально на сервере.
Я бы просто вставил это в строку, но, похоже, я слишком туп, чтобы понять, как использовать сделку уценки, поэтому код здесь:
http://www.anovasolutions.com/content/mysql-search-and-replace-stored-procedure