SQL

Теория: Регулярные выражения

Представим, что нам нужно найти всех пользователей, чье имя начинается с букв 'A' или 'B': Abigale, Andy, Brayan, ... Если мы будем использовать только символ %, то ничего не получится, потому что он заменяет собой любой символ. Следовательно, нам нужен более точный механизм фильтрации. Это регулярные выражения, о которых пойдет речь в сегодняшнем уроке.

Регулярные выражения

Язык SQL поддерживает работу с регулярными выражениями (regular expressions или RegEx). Это специальный язык, позволяющий достаточно точно определить шаблоны поиска в строке.

Для работы с регулярными выражениями используется оператор SIMILAR TO вместо LIKE.

Вернемся к нашей задаче — нужно выбрать пользователей, чье имя начинается на 'A' или 'B'. Чтобы решить ее, нужно применить такой шаблон:

SELECT
    id,
    first_name,
    last_name,
    email,
    birthday
FROM users
WHERE first_name SIMILAR TO '[AB]%';
idfirst_namelast_nameemailbirthday
8AbigaleTurnerBaby_Wintheiser@hotmail.com>2021-12-06T00:00
.000Z
11AlveraBergnaumKendall_Aufderhar@gmail.com>2021-10-11T00:00
.000Z
13AlfredaHermannTyree89@yahoo.com2021-12-12T00:00
.000Z
16AbeFunkDewayne_Lueilwitz69@hotmail.com>2021-06-16T00:00
.000Z
26AndyHuelVincenza_Mertz@gmail.com2021-07-09T00:00
.000Z
28AugustKonopelskiKarianne_Treutel@gmail.com2021-07-04T00:00
.000Z
33AlfredoSipesHiram.Schowalter24@hotmail.com>2022-01-17T00:00
.000Z
34AlejandrinNicolasElizabeth58@yahoo.com2021-09-15T00:00
.000Z
37AlvenaRutherfordLina59@hotmail.com2022-01-22T00:00
.000Z
54BrayanSengerBrianne.OKon75@gmail.com2021-06-29T00:00
.000Z
59ArneHudsonEvie_Franey72@gmail.com2021-08-17T00:00
.000Z
78AngelicaDonnellyJaylin69@hotmail.com2021-07-31T00:00
.000Z
85AraceliWisozkRonny.Braun70@hotmail.com2021-09-14T00:00
.000Z
86AndersonNaderDarrion_Yost@hotmail.com2022-04-30T00:00
.000Z
95AndresHeidenreichMyrna2@gmail.com2021-07-11T00:00
.000Z
97BernhardHermanVesta.Flatley16@hotmail.com>2021-12-20T00:00
.000Z

View on DB Fiddle

Разберем примененный шаблон [AB]%. В квадратных скобках перечисляются допустимые символы, а далее следует знакомый нам символ %. Этот запрос вернет пользователей с именами Abigale, Andy, Brayan, и так далее.

Представим, что нам нужно найти пользователей, у которых username заканчивается любой буквой. Это можно сделать таким шаблоном: %[abcdefghijklmnopqrstuvwxyz]. Согласитесь, такая запись неудобна для чтения и записи. А что, если мы случайно пропустим какую-то букву? В квадратных скобках можно использовать символ - для перечисления. Если записать в квадратных скобках начальный символ, поставить "-" и указать конечный символ, то такой шаблон вернет любой символ из диапазона от начального до конечного. Напишем запрос, который вернет всех пользователей по условию: username заканчивается любой буквой. Он будет выглядеть так:

SELECT
    id,
    username,
    email,
    birthday
FROM users
WHERE username SIMILAR TO '%[a-z]';
idusernameemailbirthday
5Curtis_BaumbachHobart91@hotmail.com2021-07-25T00:00
.000Z
6Leola.WardKenya_Legros17@yahoo.com2022-02-07T00:00
.000Z
8Bernie.CrooksBaby_Wintheiser@hotmail.com>2021-12-06T00:00
.000Z
10Berta.TrantowDorian31@gmail.com2021-06-15T00:00
.000Z
13Tina_HuelsTyree89@yahoo.com2021-12-12T00:00
.000Z
21Connie.FramiAudrey.Gibson@yahoo.com2022-02-27T00:00
.000Z
23Constantin.HeathcoteMelany_Pfeffer87@hotmail.com>2021-09-17T00:00
.000Z
26Kevon_HoweVincenza_Mertz@gmail.com2021-07-09T00:00
.000Z
27Ramona.JohnsonJasen_DAmore94@gmail.com2021-10-09T00:00
.000Z
35Prudence_ReichelJaleel.Littel@gmail.com2022-02-26T00:00
.000Z
36Name_BoyerJosie.Mante@yahoo.com2021-09-28T00:00
.000Z
37Jailyn.WatersLina59@hotmail.com2022-01-22T00:00
.000Z
38Darron.MannHailie.McLaughlin64@gmail.com>2021-08-11T00:00
.000Z
39Alfonzo_LehnerCrawford64@yahoo.com2021-09-29T00:00
.000Z
43Kristofer_LubowitzMonserrat.Carter64@hotmail.com>2022-04-20T00:00
.000Z
46Edd_HarrisCeline.Hand70@yahoo.com2022-02-08T00:00
.000Z
47Dominique_LangElecta60@gmail.com2021-09-15T00:00
.000Z
55Berta.MuellerJoshua.Lesch24@yahoo.com2022-04-14T00:00
.000Z
59Sylvan_NaderEvie_Franey72@gmail.com2021-08-17T00:00
.000Z
62Kennedy_HalvorsonVladimir.Thiel2@yahoo.com2022-02-12T00:00
.000Z
65Sean_ReillyDion_Jenkins@gmail.com2021-10-29T00:00
.000Z
66Trevion.CarterJaunita_Gislason81@yahoo.com>2022-05-09T00:00
.000Z
69Delphine_BaileySibyl65@yahoo.com2021-07-16T00:00
.000Z
72Filiberto.WolfFernando.Lakin@hotmail.com>2022-03-27T00:00
.000Z
73Carter_SkilesZoey_Ziemann@hotmail.com2021-08-22T00:00
.000Z
74Pasquale.MurphyChance_Moen@gmail.com2022-04-01T00:00
.000Z
83Declan_BorerCelestino81@hotmail.com2021-06-25T00:00
.000Z
84Verona_PowlowskiAshlynn.Lind1@yahoo.com2021-09-30T00:00
.000Z
87Elmira.KautzerTommie20@gmail.com2021-08-07T00:00
.000Z
91Bobbie.PredovicRupert33@hotmail.com2022-03-25T00:00
.000Z
98Lennie.McGlynnSalvador_Hessel83@yahoo.com>2022-02-06T00:00
.000Z
99Eldon_JohnsMaximillian28@yahoo.com2021-12-30T00:00
.000Z

View on DB Fiddle

Точно так же можно работать и с русскими буквами: '%[а-я]%'. Такой запрос поможет найти пользователей, у которых в поле username есть русские буквы:

SELECT
    id,
    first_name,
    last_name,
    email,
    birthday
FROM users
WHERE username SIMILAR TO '%[а-я]%';

View on DB Fiddle

Чтобы выбрать все цифры, используем шаблон [0-9]:

SELECT
    id,
    username,
    email,
    birthday
FROM users
WHERE username SIMILAR TO '%[0-9]';
idusernameemailbirthday
1Duncan3Trevion53@yahoo.com2022-05-25T00:00
.000Z
2Michaela11Baylee52@yahoo.com2022-01-13T00:00
.000Z
3Margarete_Hegmann6Casimer_Cronin@yahoo.com2022-04-21T00:00
.000Z
4Kayley.Turcotte98Angelita.Altenwerth96@hotmail.com>2021-10-31T00:00
.000Z
7Stan_Sauer4Kiera73@hotmail.com2022-04-13T00:00
.000Z
9Woodrow14Wyatt9@hotmail.com2022-03-05T00:00
.000Z

View on DB Fiddle

Такой запрос вернет всех пользователей, чей username заканчивается на любую цифру.

Комбинируя правила, мы можем создавать достаточно сложные шаблоны. Например, проверим, что в поле email введены корректные адреса электронной почты.

Корректная почта должна содержать адрес, который состоит из:

  • Имени с любым количеством любых символов — например, my_email
  • Символа @
  • Домена с любым количеством любых символов — например, gmail
  • Точки
  • Указания национальной зоны — например, com

Запрос на поиск корректных адресов будет таким:

SELECT
    username,
    email
FROM users WHERE email SIMILAR TO '%@%.%';
usernameemail
Duncan3Trevion53@yahoo.com
Michaela11Baylee52@yahoo.com
Margarete_Hegmann6Casimer_Cronin@yahoo.com
Kayley.Turcotte98Angelita.Altenwerth96@hotmail.com>
Curtis_BaumbachHobart91@hotmail.com
Leola.WardKenya_Legros17@yahoo.com
Stan_Sauer4Kiera73@hotmail.com
...

View on DB Fiddle

Такой запрос выведет имена пользователей с корректными адресами электронной почты, однако нам интереснее найти ошибки. В этом случае частица NOT позволит найти строки, которые не соответствуют шаблону:

SELECT
    username,
    email
FROM users WHERE email NOT SIMILAR TO '%@%.%';

View on DB Fiddle

Теперь выберем все адреса электронной почты, у которых национальная зона состоит ровно из двух символов — например, ru, su, io и так далее. При этом исключим зоны, состоящие из трех и более символов — например, com.

Это можно сделать так: %.[a-z][a-z]. Но удобнее воспользоваться еще одним спецсимволом — подчеркиванием _.

Символ подчеркивания обозначает ровно один любой символ, необязательно букву. Наш запрос будет выглядеть так:

SELECT
    username,
    email
FROM users WHERE email SIMILAR TO '%@%.__';

View on DB Fiddle

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

SELECT
    username,
    email
FROM users WHERE email SIMILAR TO '%.___';

View on DB Fiddle

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

Выводы

В этом уроке мы познакомились с оператором SIMILAR TO. Он помогает формировать шаблоны для фильтрации текстовых полей. Повторим самые полезные и часто используемые спецсимволы:

  • Символ % соответствует любому количеству любых символов
  • Квадратные скобки [] используются для перечисления конкретных символов — например, [АЕИОУЭЮ]
  • Дефис - в квадратных скобках означает перечисление символов — например, [0-9] соответствует любой цифре
  • Подчеркивание _ означает ровно один любой символ (букву или цифру)

Рекомендуемые программы