@Solodukha

Два переноса строки и как написать update с использованием REPLACE sql?

Есть html код, который хранится в БД.
</table>
 
 
</li>
</ul>

Вот именно в таком виде, с переносами. Задача в том, чтобы написать sql запрос (update с replace) и изменить все значения в таблице. Мне удаётся найти все значения через "select"
SELECT * FROM `zen_products_description` 
WHERE `products_description` 
LIKE 
CONCAT("<%/table>%", CHAR(10), CHAR(10), "<%/li%>", CHAR(10), "<%/ul>%");

Найти я смог, но не могу заменить, использую такие запросы, но всегда возвращается 0 задетых строк:
set @a = 
CONCAT("<%/table>%", CHAR(10), CHAR(10), "<%/li%>", CHAR(10), "<%/ul>%");

UPDATE zen_products_description 
SET products_description = 
REPLACE(products_description, '@a', '</table>');

и такое пробовал:
UPDATE zen_products_description 
SET products_description = 
REPLACE(products_description, 'CONCAT("<%/table>%", CHAR(10), CHAR(10), "<%/li%>", CHAR(10), "<%/ul>%")', '</table>');

Как написать правильный запрос для замены?
  • Вопрос задан
  • 4387 просмотров
Решения вопроса 1
erge
@erge
Примус починяю
  • зачем вы знак % вставляете?
    PS: знак % работает только в LIKE
  • строка должна заключаться в ' ' (одинарные кавычки), хотя для MySQL может это и не критично
  • вы точно хотите 3 тэга заменить на 1 ?
  • имхо, это вообще не критично - 2 переноса строки, или это требование по феншую? ))


Все работает
select
    replace(
       text
      ,CONCAT('</table>', CHAR(10), CHAR(10),'</li>',CHAR(10),'</ul>')
      , '</table>'
    ) as text
  from tbl;

set @a = CONCAT('</table>', CHAR(10), CHAR(10),'</li>',CHAR(10),'</ul>');

update tbl
  set text = replace(text, @a, '</table>');


пример на sqlfiddle

UPD:

Solodukha,
Если update не обрабатывает строки, это значит только одно:
  • что там переносы строк не CHR(10), либо посмотрите какие там переносы, либо попробуйте CHR(10), CHR(13) = Это один перенос строки (либо наоборот), либо еще как вариант, только CHR(13),
  • либо.. скорее всего после </table> или в тэгах есть побельные символы (пробел, табуляция и пр.) и/или "белые пробелы".


(но нам то это неизвестно, данные у ВАС)


Поэтому:
  • Либо разбор текста будет более сложный, необходимо строчными функциями искать table внутри li , сабстринг и пр. что как бы заморочно, оформлять это скорее всего хранимой процедурой.
  • Либо писать скрипт на чем угодно (bash, php, perl, python ... etc), выбирать записи и построчно: обрабатывать регуляркой, записывать обратно в бд.
  • Либо, ЕСЛИ у вас MySQL 8, все это можно сделать в БД, одним запросом используя REGEXP_REPLACE():

    примерно так:
    update tbl
      set text = REGEXP_REPLACE(
         text
        ,'<[[:blank:][:space:]]*\/table>[[:blank:][:space:]]+<[[:blank:][:space:]]*\/li>[[:blank:][:space:]]+<[[:blank:][:space:]]*\/ul>[[:blank:][:space:]]*'
        ,'</table>'
        )

    см. на dbfiddle



другого, имхо, не дано...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы