Мне нужно выполнить проверку данных в базе SQL Server. Однако правила слишком сложные для функции T-SQL LIKE
, и не удаётся реализовать их через PATINDEX
или что-то подобное.
Я хотел бы использовать регулярные выражения, так как они мощнее.
В SQL Server 2025 для этого теперь есть функция REGEXP_LIKE.
Решение
SQL Server 2025 выпущен в публичном превью (на момент написания доступна версия CTP 2.1). Среди новых функций — поддержка регулярных выражений (regex).
«Регулярное выражение — это последовательность символов, определяющая шаблон поиска».
Шаблон похож на те, что можно описывать в LIKE
, но возможности куда мощнее (и сложнее).
Часто шутят, что если проблему можно решить через regex, то у вас уже две проблемы — потому что написать хороший шаблон бывает трудно.
Поддержки regex в SQL Server не было очень долго... Для поиска использовали LIKE
, PATINDEX
, SQL CLR или переносили обработку данных в Integration Services.
Теперь всё можно делать напрямую в T-SQL.
Примечание: в SQL Server 2025 CTP 2.0 и 2.1 различий по regex нет.
Функция REGEXP_LIKE
REGEXP_LIKE — это LIKE
на стероидах.
Она проверяет, соответствует ли строка заданному регулярному выражению.
REGEXP_LIKE(string_expression, regular_expression [,flags])
Пример проверки e-mail
SELECT EmployeeKey, FirstName, LastName, EmailAddress FROM dbo.DimEmployee WHERE REGEXP_LIKE(EmailAddress, '^[\w\-\.]+@([\w-]+\.)+[\w-]{2,}$');
Запрос вернёт 294 строки с валидными e-mail из 296. Чтобы найти некорректные:
SELECT EmployeeKey, FirstName, LastName, EmailAddress FROM dbo.DimEmployee WHERE NOT REGEXP_LIKE(EmailAddress, '^[\w\-\.]+@([\w-]+\.)+[\w-]{2,}$');
Некоторые адреса с акцентами не распознаются — regex сложно писать правильно.
Даже официальный шаблон '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
не поддерживает акценты.
Лучший способ проверки e-mail — это валидация через письмо с уникальной ссылкой.
Флаговый параметр
У функции есть третий необязательный параметр — флаг:
- i — без учёта регистра
- m — многострочный режим
- s —
.
совпадает и с\n
- c — чувствительный к регистру
Пример с именами
Regex для поиска имён, начинающихся на F:
\bF[a-z].*
Меняем имя на заглавные буквы:
UPDATE dbo.DimEmployee SET FirstName = UPPER(FirstName) WHERE EmployeeKey = 47; /* Fred → FRED */
Несмотря на то, что FRED
в верхнем регистре, он попадает в выборку.
Значит, по умолчанию regex работает без учёта регистра.
Запрос с явным указанием c
(чувствительный к регистру) исключит FRED из результата.
Но «Hung-Fu» попадёт, так как «Fu» regex видит как отдельное слово.
Выводы
Regex — мощный, но сложный инструмент. Перед его использованием стоит проверить,
можно ли решить задачу обычным LIKE
.
Кроме того, использование regex может негативно повлиять на производительность.
Подробнее см. блог Брента Озара: «T-SQL Has Regex in SQL Server 2025. Don’t Get Too Excited».
Комментариев нет:
Отправить комментарий