SQL: вложенные операторы

Всем привет!

Кому-то данный очерк покажется банальным и бесполезным, но, как показала практика, не все знают про этот, казалось бы, очевидный “лайфхак” — то, что результат работы одних операторов может быть операндом другого оператора.

Сложно и непонятно? Сейчас поясню на примере.

Вот, допустим, у нас есть массив однотипных строк. И нам нужно вырезать из каждой строки часть от одного символа до другого символа.

Что нам для этого надо сделать? Найти 2 значения, которые будут вычисляться динамически, на ходу, и будут уникальны для каждой отдельной строки в массиве.

Итого нам понадобится 2 команды — на вырезание подстроки и на определение позиции определённого символа.

Например, есть у нас строковое значение “quality-lab@mail.ru”. Из него будем вырезать часть, находящуюся между дефисом и @ (в нашем случае это будет “lab”).

Давайте начинать с малого: команды вырезания подстроки из строки в MySQL — это substr, и она имеет следующий формат: substr(a, b, c), где 

a — строка, из которой вырезаем,

b — позиция, с которой вырезаем,

c — кол-во символов, которое вырезаем.

Дальше нам понадобится команда, которая ищет символ в строке и возвращает его позицию (первого вхождения) — locate. Она пишется так: locate(a,b), где

а — символ, который ищем,

b — строка, в которой ищем.

И этих инструментов нам будет, в принципе, достаточно. Что делаем дальше?

Ну, для начала, будем искать позицию, с которой начнём вырезать(substr) — это будет позиция символа “-”. Вот так будет выглядеть команда поиска позиции дефиса в строке: 

locate(‘-‘, ‘quality-lab@mail.ru’),

а вот так: 

select substr(‘quality-lab@mail.ru’, locate(‘-‘, ‘quality-lab@mail.ru’)), —  

вся команда, вырезающая подстроку с дефиса и до конца (да, вы правильно поняли — substr можно применять и без последнего параметра, тогда будет вырезано всё до конца строки). И вот таким будет результат работы этого запроса: “-lab@mail.ru”

Почему туда попал дефис? Да потому, что мы искали позицию дефиса в строке, а начать вырезать нам нужно не с дефиса, а со следующего за ней символа. В итоге, приходим к следующему:

select substr(‘quality-lab@mail.ru’, locate(‘-‘,’quality-lab@mail.ru’)+1) 

Этот запрос у нас возвращает строку без дефиса: “lab@mail.ru”.

Полдела сделано, в принципе. 

Едем дальше — теперь нам надо указать, сколько символов мы будем вырезать . Для этого мы будем делать “финт ушами” — из позиции символа “@” будем вычитать позицию символа “-” +1(нам же нужен не сам дефис, а следующий за ним символ). Делается это так:

select locate(‘@’, ‘quality-lab@mail.ru’) — (locate(‘-‘, ‘quality-lab@mail.ru’) + 1)

В результате получаем цифру 3 — это длина текста между дефисом и собакой. Теперь осталось это дело вставить в выражение substr. Получаем на выходе вот такую монструозную штуку:

select substr(‘quality-lab@mail.ru’, locate(‘-‘, ‘quality-lab@mail.ru’) + 1, locate(‘@’, ‘quality-lab@mail.ru’) — (locate(‘-‘, ‘quality-lab@mail.ru’)+1))

Итогом получаем вожделённое “lab”

Страшно? Понимаю, сам испугался. Давайте еще раз по кускам рассмотрим эту дичь:

substr(‘quality-lab@mail.ru’,говорим, что будем вырезать подстроку из строки 

quality-lab@mail.ru’;

locate(‘-‘, ‘quality-lab@mail.ru’) + 1, — в качестве параметра “с какого места начнём вырезать” указываем символ, следующий за дефисом;

locate(‘@’, ‘quality-lab@mail.ru’) — (locate(‘-‘, ‘quality-lab@mail.ru’)+1)) в качестве параметра “сколько символов будем вырезать” указываем разницу в позициях между символом, следующим за дефисом и @.

Вот, в принципе, и всё. Здесь мы рассмотрели на примере, как можно одни операторы использовать внутри других. Надеюсь, материал был полезен). 

Если вам стало интересно, что за зверь такой “sql” — приходите к нам на ПОИНТ, я вас научу росчерком пера писать запросы, жонглировать типами данных и вообще повелевать информацией!

Метки
ISTQB FL (4)IT (1)Java для тестировщиков (1)Jedi Point (12)JSON (1)kaizen (2)Pairwise Testing (1)QA (25)QualityLab (1)REST API (1)selenium (1)SOAP UI (1)softskills тестировщика (7)SQA Days-25 (1)Sql в тестировании (6)TestSuites (1)XML (1)xpath (1)Анна Палей (1)Исследовательское тестирование (3)История успеха (17)Курс тестирования для начинающих (12)Мнемоники в тестировании (1)Наталья Руколь (1)Нина Агеева (4)Обучение тестированию (13)ПОИНТ (49)Роман Буданов (3)Сессионное тестирование (1)ТЗ (1)Таблица решений (1)Тест-анализ (2)Тест-дизайн (6)Тест-кейс (1)Тест-стратегия (1)Тест-туры (1)Тестирование usability (6)Тестирование ПО (7)Тестирование игр (4)Тестирование мобильных приложений (4)Тест менеджмент (3)Чек-лист в тестировании по (4)Чит-лист в тестировании (2)автоматизация тестирования (2)автотесты (1)английский для тестировщиков (2)аудит проекта (2)баг (1)багнапродакшене (1)введение в тестирование (1)виды тестировния (2)граничные значения (1)декомпозиция (1)инструменты тестирования по (4)как надо тестировать (2)как стать тестировщиком (2)комбинаторика в тестировании (1)метрики тестирования (1)начать карьеру в IT (8)начинающий тестировщик (11)негативное тестирование (2)ограничения (1)оптимизация QA-процессов (1)организация тестирования (1)персонажи (1)планирование тестирования (1)профессия тестировщик (3)резюме (1)сертификация ISTQB FL (3)скринкаст (1)смена работы (2)сопроводительное письмо (1)тест-кейс (1)тест-менеджмент (2)тестирование безопасности (1)тестирование веб (3)тестовая стратегия (1)удаленная работа (1)управление требованиями (6)фреймворк тестирования (1)школа тест-менеджера (2)
С 22.06 по 8.09, ОНЛАЙН Зарегистрироваться