Задать вопрос

Как удалить предложение в столбце с типом TEXT?

У меня есть таблица `sonnik`, в ней есть столбец `text` с типом TEXT.
В записях содержится текст
Сонник Абажуры : к чему снятся Абажуры женщине или мужчине

где слово Абажуры в других записях заменяется на другие слова.
Мне нужно найти текст в таких записях, начинающийся со слова "Сонник" и заканчивающее на "женщине или мужчине" и удалить полностью всё предложение. Таких предложений внутри одной записи сразу несколько.
Делаю так, но получаю пустоту по итогу, ничего не меняется.
DELETE FROM `sonnik` WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(`text`, '\n', find_in_set('женщине или мужчине', `text`)), '\n', -1) LIKE 'Сонник %' AND text LIKE '%Сонник %';
  • Вопрос задан
  • 66 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
mayton2019
@mayton2019
Bigdata Engineer
Могу дать просто несколько советов как упростить работу с текстом.
1) У тебя слишком много всего наворочено в одной строке. Разбей запрос на части.
Например сначала сделай просто SELECT того что ты хочешь удалять. Почему это важно?
Если ты ошибешся и сделаешь слишком либеральный квантор - то удалишь те строки которые
удалять было не надо. И назад дороги нет.

SELECT * 
FROM 
 `sonnik` 
WHERE 
 SUBSTRING_INDEX(SUBSTRING_INDEX(`text`, '\n', find_in_set('женщине или мужчине', `text`)), '\n', -1) 
          LIKE 'Сонник %' 
 AND text LIKE '%Сонник %';

И просматривай глазами кандидатов на удаление.

2) Вот это выражение 'женщине или мужчине' слишком строгое. В реальном тексте может
быть многообразие склонений падежей и вообще слова могут быть с переносом через
дефис на новую строку. Поэтому надо искать лемму или основу слова типа "жен".... "муж"

И лучше использовать предикат ILIKE для регистро-независимого сравнения.

3) И как всегда я выражаю своё ворчание по поводу этого тега SQL. Что такое SQL? MySQL? Postgres? Там возможности текстового поиска разные. Есть всякие текстовые индексы и прочие функции FTS.
Ответ написан
Вам нужно изменить содержимое только одного столбца, поэтому не DELETE, а UPDATE SET = ....
И как сказал Akina, REGEXP_REPLACE.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы