Хотя в наши дни я в основном работаю с MySQL / MariaDB над проектами внутренней веб-разработки, я изучаю Oracle SQL с конечной целью стать сертифицированным. Недавно я посмотрел отличное видео на YouTube и решил попробовать свои силы в переносе запросов Oracle SQL в сопоставимый MySQL в качестве учебного упражнения. В этом сообщении блога подробно описаны вопросы, которые я придумал для получения конечных результатов. Продолжайте читать, чтобы узнать о некоторых забавных рекурсивных CTE с использованием символьной функции SUBSTRING() и интересных вариантов отображения вывода.

Самореклама:

Если вам нравится содержание, написанное здесь, обязательно поделитесь этим блогом и своими любимыми сообщениями с другими людьми, которым он также может быть полезен или им понравится. Поскольку кофе - мой любимый напиток, вы можете даже купить мне его, если хотите!

Кредитный ресурс и вдохновение

В видео ниже автор предоставляет несколько примеров отображения определенного слова в различных форматах вывода с использованием предложения Oracle SQL CONNECT BY и псевдостолбца ROWNUM. Siva Academy - фантастический канал об Oracle SQL. Автор действительно хорошо осведомлен и всегда имеет интересные примеры для демонстрации. Я настоятельно рекомендую посетить этот канал, если вас интересует Oracle SQL. Я был вдохновлен написать этот пост в блоге из-за этого видео и хочу поблагодарить постер.

Вдохновляющее видео от Siva Academy. (внешняя ссылка)

Рекурсивный CTE, определяемая пользователем переменная сеанса, функции SUBSTRING () и LENGTH ()

Для более простой и удобной обработки я буду использовать определяемую пользователем переменную сеанса, чтобы представить показанное здесь слово «ИЗМЕНЕНИЯ» с помощью команды SET:

На момент написания MySQL не поддерживает предложение CONNECT BY или псевдостолбец ROWNUM, найденные в Oracle SQL. Поэтому, чтобы воспроизвести функциональность обеих конструкций, я реализовал несколько обходных путей.

К счастью, MySQL 8 представил предложение WITH (также называемое общим табличным выражением). Более того, предложение RECURSIVE WITH играет важную роль в имитации псевдостолбца ROWNUM, в этом конкретном контексте, из-за его рекурсивного характера. Поэтому, если вы планируете следовать примерам запросов, вам понадобится MySQL 8 или выше.

На время этого сообщения и последующих запросов предположим, что рекурсивный CTE, rownum_generator, (показанный ниже) находится в области действия:

Получение всех строк из CTE rownum_generator возвращает увеличивающийся набор целочисленных значений, заканчивающихся на 7, что является длиной целевой строки «CHANGES»:

В этой статье я буду использовать еще две функции MySQL: SUBSTRING() и LENGTH(). SUBSTRING() принимает до 3-х параметров; 2 обязательных и 1 необязательный. Два обязательных параметра: target_string и start_position. Единственный необязательный параметр - это значение length.

SUBSTRING() возвращает часть строки в зависимости от поддерживающих параметров (или их отсутствия). То, как SUBSTRING() обрабатывается с помощью рекурсивного CTE, определяет уникальные выходные данные.

По теме: Прочтите сообщение Символьная функция Oracle SQL SUBSTR () - Среднее кросс-пост (внешняя ссылка) для получения дополнительной информации о аналогичной символьной функции Oracle.

Рекурсивные CTE и SUBSTRING (): по 1 символу в строке для каждого символа.

При просмотре этого первого запроса цель состоит в том, чтобы вернуть по одному символу в строке для всех символов в слове «ИЗМЕНЕНИЯ».

Параметр start_position является динамическим на основе столбца CTE rownum_generator, rownum. Поэтому каждое исходное положение меняется. Кроме того, параметр length указывает только 1 символ, который должен быть извлечен для этого варианта отображения. Более наглядный пример можно реализовать, возвращая значение rownum в интервале каждой строки в результатах запроса:

Рекурсивные CTE и SUBSTRING (): по 1 символу в строке для каждого символа, начиная с конца строки.

В следующем примере я зациклился, пока я снова не вернул движущееся значение rownum вместе с вызовом функции SUBSTRING() в результатах запроса. Здесь я запрашиваю 1 букву из целевой строки в каждой строке, но начинаю извлечение с конца строки «CHANGES» из-за отрицательного числа rownum (показано в последующем запросе):

Рекурсивные CTE и SUBSTRING (): динамическое количество символов в строке, начиная с конца строки

Приведенный ниже экран вывода очень похож на предыдущий, за исключением того, что когда из target_string был извлечен только 1 символ, теперь я извлекаю динамическое количество символов на основе любого значения rownum для этой конкретной строки:

Опять же, установка для параметра start_position значения выражения rownum * - 1 начинает извлечение в конце target_string, поскольку оно отрицательное. Но вместо извлечения только 1 символа количество символов определяется значением столбца rownum. Оказывается, это то же самое число, которое необходимо для извлечения оставшейся части строки «CHANGES».

Я взял за правило писать еженедельное электронное письмо о SQL / PHP, которое я изучаю и которое меня интересует. Если это похоже на то, частью чего вы хотели бы стать, используйте эту подписку (внешняя ссылка) сформировать и подписаться. Спасибо!

Рекурсивные CTE и SUBSTRING (): динамическое количество символов в строке, начиная с 1-го символа.

Самый простой пример, на мой взгляд, показан в следующих результатах запроса. Я просто устанавливаю для параметра start_position значение 1, а для параметра length значение столбца rownum.

Например, при просмотре последней строки в результатах запроса возвращается слово «ИЗМЕНЕНИЯ». Почему?

Имея start_position, равное 1, и значение столбца rownum, равное 7 для значения параметра length (на данном этапе выполнения), все 7 символы текста возвращаются SUBSTRING(). Достаточно просто, правда?

Рекурсивные CTE и SUBSTRING (): все символы до последнего символа

В тех случаях, когда параметр length не предоставлен для SUBSTRING(), функция возвращает оставшееся количество символов, найденных в target_string из start_position и Именно так работает следующий пример запроса с использованием значения столбца rownum, чтобы указать, где должно начинаться извлечение:

Рекурсивные CTE и SUBSTRING (): заменяйте отсутствующие символы пробелом

Я должен быть здесь откровенен. Последние 2 примера доставили мне наибольшее горе из всех запросов. Я не уверен, что смог бы решить эти две последние загадки без использования CASE выражения, хотя автор YouTube не использовал CASE в продемонстрированных примерах.

По теме: Прочтите сообщение Функция динамического RPAD () с использованием выражения CASE - пример Oracle SQL (внешняя ссылка), где вы найдете еще один пример динамического CASE выражения я много позаимствовал у :).

Похоже: Вы не знакомы с выражением CASE? Не беспокоиться. Я написал 2 сообщения, о которых вы рассказали. См. Простое выражение CASE MySQL - с примерами и Выражение CASE поиска MySQL - с примерами (внешняя ссылка), чтобы узнать больше.

Ниже приведены результаты запроса:

С общей целью дополнить выражение SUBSTRING(@changes, 1, rownum) числом пробелов, равным и не превышающим длину 7 (длина строки "CHANGES"), я использую динамический CASE выражение для 2-го LPAD() параметра. Какова конечная длина строки, которая будет дополнена после применения всего заполнения.

Давайте выполним запрос и отобразим значение выражения CASE вместе с выходными данными функции LPAD() для большей ясности:

Обратите внимание, что значение столбца cse_lt согласовано с 7. Это желаемая длина строки после того, как LPAD() применяет какое-либо заполнение. Таким образом, правильное количество пробелов добавляется к возвращаемому значению SUSTRING() в зависимости от того, какая часть извлекается на основе значения столбца rownum.

Переходя к последнему примеру запроса, он больше похож на предыдущий, за исключением того, что для параметра SUBSTRING() start используется 1, и мы извлекаем количество символов, равное rownum value параметр length.

Рекурсивные CTE и SUBSTRING (): отображаются все выходные данные.

Я предоставил все нижеприведенные решения одним запросом:

Надеюсь, вам понравился этот пост. Я знаю, что мне было очень весело изучать различные паттерны и писать о них. Попробуйте свои собственные и дайте мне знать о них в комментариях. Спасибо за чтение

Если у вас есть вопросы или вы видите ошибки в коде, оставьте комментарий в разделе комментариев. Поступая так, я могу продолжать публиковать ценные и точные сообщения в блоге.

Нравится то, что вы прочитали? Видите что-нибудь неправильное? Прокомментируйте, пожалуйста, ниже и спасибо за чтение !!!

Призыв к действию!

Спасибо, что нашли время прочитать этот пост. Я искренне надеюсь, что вы открыли для себя что-то интересное и поучительное. Пожалуйста, поделитесь своими выводами здесь с кем-нибудь, кого вы знаете, кто тоже получит от этого такую ​​же ценность.

Посетите страницу Портфолио-проекты, чтобы увидеть сообщения в блоге / технические статьи, которые я написал для клиентов.

Горячий черный кофе так хорош! Купи мне чашку!

Чтобы получать уведомления по электронной почте (Никогда не спамить) от этого блога (Проза цифровой совы) о последних публикациях в блоге по мере их публикации, пожалуйста, подпишитесь (по собственному желанию), нажав кнопку Нажмите, чтобы подписаться! На боковой панели на домашняя страница! (Не стесняйтесь в любое время просмотреть страницу политики конфиденциальности Digital Owl's Prose по любым вопросам, которые могут у вас возникнуть: обновления по электронной почте, подписка, отказ, контактные формы и т. Д.)

Обязательно посетите страницу Best Of, где собраны мои лучшие сообщения в блоге.

Джош Отвелл хочет учиться и расти как разработчик SQL и блогер. Другие любимые занятия находят его, уткнувшись носом в хорошую книгу, статью или командную строку Linux. Среди них он разделяет любовь к настольным ролевым играм, чтению фэнтезийных романов и проведению времени с женой и двумя дочерьми.

Отказ от ответственности: примеры, представленные в этом посте, представляют собой гипотетические идеи о том, как достичь аналогичных результатов. Это не самое лучшее решение. Большинство, если не все, из представленных примеров выполняются в среде рабочей станции для личного развития / обучения и не должны считаться производственными или готовыми к использованию. Ваши конкретные цели и потребности могут отличаться. Используйте те методы, которые лучше всего подходят для ваших нужд и целей. Мнения мои собственные.

Первоначально опубликовано на https://joshuaotwell.com 14 июля 2021 г.