Поиск и замена слов в строках на SQL

Поиск и замена слов в строках на SQL
Комментарии: 10

Часто в таблицах базы данных требуется произвести поиск и замену слова или подстроки. Для таких действий в SQL есть специальная функция «Replace». Рассмотрим на примерах как она работает в MySQL.

Внимание! При массовой обработке данных в базах данных не забывайте предварительно делать резервную копию.

Допустим, у компании поменялось название и требуется его заменить в таблице «table_name» на новое. Для этого выполняем запрос на обновление поля «field_text» с использованием нашей функции.

UPDATE `table_name` SET `field_text` = REPLACE(`field_text`,'АО Газмяс','ООО Газмяс') WHERE `field_text` LIKE '%АО Газмяс%';

В качестве параметров передаём содержимое текущего поля, подстроки для поиска и замены. Секцию «WHERE» можно опустить, но препочтительно чтобы операция «UPDATE» применялась только к тем записям, где предварительно обнаружилась искомая подстрока.

Удаление подстроки из таблицы

Для удаления произвольной подстроки используем ту же функцию, но последний параметр указываем пустым.

UPDATE `table_name` SET `field_text` = REPLACE(`field_text`,'АО Газмяс','');

Добавление подстрок к полю

Существую случаи когда в начало или конец поля требуется что-то добавить. Например, новое предложение. В этих случая в SQL используют функцию объединения строк — «Concat».

UPDATE `table_name` SET `field_text` = CONCAT(`field_text`,' THE END!');

Эту же задачу можно решить и спомощью «Replace». При этом появляется возможность добавлять подстроку в начало поля.

UPDATE `table_name` SET `field_text` = REPLACE(`field_text`,`field_text`,'START! ' + `field_text` + ' THE END!');

В примере к каждому полю таблицы в начало добавляется подстрока «START!», а в конец — « THE END!».

Приведённые SQL запросы можно выполнять как на PHP, так и через скрипты администрирования, вроде «phpMyAdmin».

Темы:
SQL
Ещё интересное — 2
Комментарии —
  1. Максим
    Максим19 ноября 2019, 18:22#
    Спасибо за статью. Помогло предложенное решение.
    1. Andy Si20 ноября 2019, 14:13#
      Отлично… уже значит не зря писал :)
    2. Дмитрий Фёдоров
      Дмитрий Фёдоров16 мая 2022, 11:50#
      а как сделать замену во всех таблицах? особенно когда нет списка всех такблиц, где может находиться нужное значение
      1. Andy Si16 мая 2022, 12:29(был изменён)#
        На чистом SQL никак. Можно экспортировать базу в текстовый файл, заменить всё в нём и импортировать обратно.
        1. Дмитрий Фёдоров
          Дмитрий Фёдоров16 мая 2022, 12:32#
          Я обычно так и делаю, но Notepad++ зависает очень часто, из за большого количества данных в одной строке. Как тут быть?
          1. Andy Si16 мая 2022, 12:37#
            Sublime Text неплохо справляется с обработкой больших текстовых файлов. Но если файл рейально очень большой, то похоже придётся писать какую-нибудь программу для его обработки, готовых решений не встречал, хотя возможно и есть.
      2. Дмитрий Фёдоров
        Дмитрий Фёдоров16 мая 2022, 12:39#
        Благодарю, попробую!
        1. Юрий
          Юрий30 сентября 2022, 12:52(был изменён)#
          Приветствую!
          Вопрос немного другой, но, в целом, вполне подходит для данной статьи.

          у меня есть база, в которую я планирую заносить отчеты по бэкапам.
          каждый сервер отправляет данные в данную таблицу.
          Задача:
          Если ID существует, то обновить данные, если id нет, то добавить данные.

          Как-то так, я думаю, надо делать, но прошу скорректировать…
          use Regions_Report_Backup;
          go
          if OBJECT_ID ('dbo.Table_1', 'id') is null
              insert into dbo.Table_1 (id, server, db_time, db_size, db_check, data_time, data_size, data_check, pst_time, pst_size, pst_check, system_time, system_size, system_check) value (103, 'S10303', '2022.09.28', '4340133137', 'true', '2022.09.30', '7791564650', 'true', '2022.09.29', '5337385942', 'true', '2022.09.24', '27660377957','true')
          else
              update dbo.Table_1 set db_time = '2022.09.28', db_size = '4340133137', db_check = 'true', data_time = '2022.09.30', data_size = '7791564650', data_check = 'true', pst_time = '2022.09.29', pst_size = '5337385942', pst_check = 'true', system_time = '2022.09.24', system_size = '27660377957', system_check = 'true'
          go
          
          1. Andy Si30 сентября 2022, 16:10#
            Добрый день. Если работает, то вроде нормальный вариант.
            А так решение задачи зависит от СУБД
            Например, в mysql для этих целей есть конструкция INSERT… ON DUPLICATE KEY UPDATE
          2. Влад
            Влад17 апреля 2024, 19:57#
            Здравствуйте. А подскажите можно ли как-то заменить ссылки вида /?p=260 на название записи в базе данных msql? У меня в поле guid таких ссылок очень много, насколько я понимаю с них идёт редирект на нормальную ссылку. Как это исправить?
            © REALADMIN.RU   2024 г.
            Страница сгенерирована: 0,0777 s | 4 mb.
            На каком уровне Вы играете в шахматы?
            OPROS