В настоящее время у нас есть база данных, в которой за эти годы хранится более 100 000 записей данных, но в структуре, которая больше не работает.
В таблице есть поле с именем youtube_video
Он хранит все видео YouTube для встраивания, например так:
http://www.youtube.com/embed/3mHuu5NklOs?rel=0 http://www.youtube.com/embed/3mHuu5NklOs
Нам нужно изменить его на:
https://www.youtube.com/watch?v=3mHuu5NklOs
Есть ли способ написать запрос, который делает это изменениес одним запросом?
Вы можете использовать REGEXP_REPLACE:
SELECT REGEXP_REPLACE( youtube_video, '^http://www.youtube.com/embed/([^?]+).*', 'https://www.youtube.com/watch?v=\1' ) FROM mytable
Распределение регулярных выражений:
^
http://www.youtube.com/embed/
([^?]+)
\1
REGEXP_REPLACE()
.*
Эта демонстрация на DB Fiddle возвращает:
| youtube_video | new_youtube_video | | ---------------------------------------------- | ------------------------------------------- | | http://www.youtube.com/embed/3mHuu5NklOs?rel=0 | https://www.youtube.com/watch?v=3mHuu5NklOs | | http://www.youtube.com/embed/3mHuu5NklOs | https://www.youtube.com/watch?v=3mHuu5NklOs |
При необходимости вы можете легко превратить это в UPDATE:
UPDATE
UPDATE mytable SET youtube_video = REGEXP_REPLACE( youtube_video, '^http://www.youtube.com/embed/([^?]+).*', 'https://www.youtube.com/watch?v=\1' );