Как заменить слово в тексте?

Тема в разделе "Базы данных", создана пользователем Dark Wizard, 23 мар 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Dark Wizard

    Dark Wizard

    Регистр.:
    23 сен 2007
    Сообщения:
    153
    Симпатии:
    76
    Проблема:

    У меня есть таблица например users, в ней есть поля pole1, pole2, pole3. Как выглядит sql запрос, который во всех записях всех полей заменит слово1 на слово2? Запись может содержать большой текст (мне нужно переименовать всех player1 на player2).

    Спасибо.
     
  2. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    235
    Симпатии:
    60
    Я так понимаю нужно заменить часть записи
    т.е. pole1 = "player1 блабла бла" его надо поменять на "player2 блабла бла"
    а блабла бла не трогать?
     
  3. BlackPawn

    BlackPawn Постоялец

    Регистр.:
    19 мар 2009
    Сообщения:
    75
    Симпатии:
    27
    UPDATE TableName SET ColumnName=REPLACE(ColumnName,'OldSubString','NewSubSrting') WHERE ColumnName LIKE '%OldSubString%'
     
  4. pavel012007

    pavel012007

    Регистр.:
    12 мар 2008
    Сообщения:
    210
    Симпатии:
    117
    а если требуется заменить "мастерские", но не трогать "автомастерские"? Как я понимаю, REPLACE() уже не поможет :(
     
  5. midw0rk

    midw0rk Создатель

    Регистр.:
    1 окт 2008
    Сообщения:
    33
    Симпатии:
    7

    REPLACE ищет вхождения искомой подстроки, в колонке и изменяет его, так что будет работать. Можно проверить:


    SELECT REPLACE(’www.nulled.ws’, ‘w’, ‘W’);
     
  6. pavel012007

    pavel012007

    Регистр.:
    12 мар 2008
    Сообщения:
    210
    Симпатии:
    117
    У меня не работает.
    SELECT REPLACE("танки и станки", "танки", "'тигры' и 'пантеры'")
    дает "'тигры' и 'пантеры' и с'тигры' и 'пантеры'".
    А надо "'тигры' и 'пантеры' и станки". Т.е. чтоб "танки" заменялись, а "станки" - нет. Я это и имел в виду в своем последнем посте.
     
  7. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    235
    Симпатии:
    60
    pavel012007
    а эту замену надо производить непосредственно в базе? т.е. может проще через php preg_replace?

    а с чистым mysql народ развлекается так:

    http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=571803#5868045

    смотри может поможет
     
  8. Виллен

    Виллен

    Регистр.:
    12 мар 2009
    Сообщения:
    235
    Симпатии:
    60
    midw0rk
    посмотри внимательно, станки у тебя тоже заменились, а pavel012007 этого не хочет.
    или ты код не тот привел.

    ксати в Оракле есть regexp_replace, но тоже не полный, модификатор \b - границу слова не поддерживает, т.е. даже переход на оракл не позволит избежать "колбасы" с replace'ами
     
  9. pavel012007

    pavel012007

    Регистр.:
    12 мар 2008
    Сообщения:
    210
    Симпатии:
    117
    Конечно проще, но насколько это эффективно будет при выполнении запроса? Фактически базу нужно прогнать через скрипт. А если база большая и делать это нужно регулярно?
    Мускул использует, как я понимаю, уже скомпиленную реализацию REPLACE, которая работает в разы быстрее написанной на пхп. Я думал про хранимые процедуры - но они тоже будут для каждой записи интерпретироваться, т.е. скорость выполнения запроса останет желать лучшего. В идеале в мускуле должен быть свой набор функций preg_NNNNNN, но я не нашел ничего похожего.
     
  10. sel

    sel Писатель

    Регистр.:
    1 окт 2008
    Сообщения:
    4
    Симпатии:
    1
    UPDATE имя_таблицы SET имя_поля1=значение1, имя_поля2=значение2, имя_поля3=значение3;
     
Статус темы:
Закрыта.