3.9.25

Функция REGEXP_LIKE в SQL Server 2025

Автор: Koen Verbeeck. REGEXP_LIKE Function in SQL Server 2025

Мне нужно выполнить проверку данных в базе 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».

Комментариев нет:

Отправить комментарий