SQL Запрос замены строки на заполнитель - PullRequest
1 голос
/ 25 февраля 2020

В моей таблице много записей (путей к изображениям). Такая строка является URL-адресом и выглядит так:

https://example.com/images/do.php?id=1234

И мне нужно изменить их все на этот формат

https://example.com/images/1234.png

Таким образом, "ID" равен имени файла. Заменить только URL не так сложно, но мне нужно добавить расширение файла stati c, которое в моем случае "png" в конце строки URL. Так что мне нужно что-то подобное

UPDATE post SET message = REPLACE(message, 'https://example.com/images/do.php?id=', 'https://example.com/images/{id}.png');

Я абсолютно не опытный SQL пользователь, так что вы можете мне помочь?

Редактировать //

Теперь у меня есть такие записи:

https://example.com/images/1234
https://example.com/images/5678

Какой запрос мне нужен, чтобы добавить расширение файла stati c? Поэтому мои записи выглядят так:

https://example.com/images/1234.png
https://example.com/images/5678.png

Длина идентификатора составляет от 4 до 6 символов. Основная проблема здесь, почему я не могу просто добавить расширение, состоит в том, что моя строка сообщения содержит больше текста, чем просто URL для изменения. Такая строка может выглядеть так:

Here is your image link: [LINK]https://example.com/images/1234.png[/LINK] You can view it now.

Edit2 //

Моя таблица БД с именем "post" выглядит следующим образом

id   |   message
----------------
1    |   test
2    |   Here is your image link: [LINK]https://example.com/images/1234[/LINK] You can view it now.
3    |   some strings
4    |   Here is your image link: [LINK]https://example.com/images/5678[/LINK] You can view it now.
5    |   [LINK]no correct url[/LINK]
6    |   [LINK][IMG]https://example.com/images/9123[/IMG][/LINK]
7    |   [LINK]https://example.com/images/912364[/LINK]

Таким образом, не каждая строка сообщения содержит URL-адрес, и не каждое сообщение с тегом [LINK] содержит правильный URL-адрес. Также есть записи, которые имеют более длинный идентификатор, они не должны быть изменены.

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Для вашей второй проблемы:

UPDATE post
SET message = concat(message,'.png')

Просто добавьте текущую запись с помощью '.png': -)

РЕДАКТИРОВАТЬ: Итак, мой плохой! Вы должны попробовать Regex:

UPDATE post
SET message = CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/LINK\].*'))

Этот оператор утверждает, что расширение файла не существует. Таким образом, вы можете выполнить инструкцию без предложения where, потому что расширение файла не будет удвоено. Чтобы убедиться, что вы можете проверить это раньше с помощью:

SELECT
    message
    ,CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/LINK\].*')) as corr_message
FROM path

Проверьте шаблон, например, на Regex101.com с вашим примером в виде строки

Here is your image link: [LINK]https://example.com/images/1234[/LINK] You can view it now.

и следующий как образец

(.*https:\/\/example\.com\/images\/[0-9]{4,6})(\[\/LINK\].*)

Скобка строит группы. Первая группа для первой части строки. В обновлении это первая часть Concat. После этого мы установим «.png». Третья часть с вашим оператором обновления представляет собой вторую группу регулярных выражений.

Надеюсь, это поможет вам. :)

EDIT2: Хорошо, это будет соответствовать вашим строкам.

UPDATE post
SET message = CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/(IMG|LINK)\].*')) 
WHERE message LIKE '%https://example.com/images/%'

Шаблон для проверки:

(.*https:\/\/example\.com\/images\/[0-9]{4,6})(\[\/(IMG|LINK)\].*)

Как выбрать для проверки ваших данных перед обновлением:

SELECT
    message
    ,CONCAT(REGEXP_SUBSTR(path,'.*https:\/\/example\.com\/images\/[0-9]{4,6}'),'.png',REGEXP_SUBSTR(path,'\[\/(IMG|LINK)\].*')) as corr_message
FROM path
WHERE message LIKE '%https://example.com/images/%'

Надеюсь, что сейчас подходит для вашего случая:)

1 голос
/ 25 февраля 2020

Это отвечает на оригинальную версию вопроса.

Это работает для примера в вашем вопросе:

select concat(substring_index(path, 'do.php', 1),
              substring_index(path, '=', -1),
              '.png')
from (select 'https://example.com/images/do.php?id=1234' as path) x

Вы можете легко превратить это в update:

update post
    set message = concat(substring_index(message, 'do.php', 1),
                         substring_index(message, '=', -1),
                         '.png')
    where message like '%do.php%=%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...