SQL-запрос для замены строки на основе подстановочного знака - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы выполнить этот тип запроса в моей базе данных WP, чтобы удалить все экземпляры span с id = "more-":

UPDATE wp_posts SET post_content = REPLACE (
post_content,
'<p><span id="more-35075"></span></p>',
'');

Но число, которое следует за 'more-' в моем примере, является переменной. Как написать этот запрос с использованием символа подстановки: span id = "more - *.

Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

В MySQL версии 8.0 и выше вы можете использовать функцию REGEX_REPLACE(). При отсутствии того же могут выполняться некоторые сложные строковые операции. Это основано на вашем подтверждении , что указанная подстрока встречается только один раз в значении.

REPLACE() не поддерживает подстановочные знаки, шаблоны, регулярные выражения и т. Д. Он только заменяет данную фиксированную подстроку другой фиксированной подстрокой, в большей строке.

Вместо этого мы можем попытаться извлечь части из post_content. Мы извлечем ведущую подстроку перед '<p><span id="more-', используя функцию Substring_Index(). Точно так же мы извлечем конечную подстроку после части '"></span></p>'.

Теперь мы можем просто Concat() этих порций, чтобы получить необходимые post_content. Вы можете найти подробную информацию о различных функциях String, используемых здесь: https://dev.mysql.com/doc/refman/8.0/en/string-functions.html

Я также добавил условие WHERE, чтобы мы выбирали только те строки, которые соответствуют нашим заданным критериям подстроки.

UPDATE wp_posts 
SET post_content = 
CONCAT( 
       SUBSTRING_INDEX(post_content, 
                       '<p><span id="more-', 
                       1), 
       SUBSTRING(post_content, 
                 LOCATE('"></span></p>', 
                        post_content, 
                        LOCATE('<p><span id="more-',
                               post_content)
                        ) + 13) -- 13 is character length of "></span></p>
      )
WHERE post_content LIKE '%<p><span id="more-%"></span></p>%';

Запрос № 1: Данные перед операциями обновления

SELECT * FROM wp_posts;

| post_content                                            |
| ------------------------------------------------------- |
| adasdaadsa<p><span id="more-35075"></span></p>121324124 |
| 1412123123<p><span id="more-232"></span></p>adasdaafas  |

Запрос № 2: Данные после операций обновления

SELECT * FROM wp_posts;

| post_content         |
| -------------------- |
| adasdaadsa121324124  |
| 1412123123adasdaafas |

Просмотр на БД Fiddle

...