REGEXP_LIKE (Transact-SQL)

Применимо к: Sql Server 2025 (17.x) База данныхSQL Azure Управляемого экземпляраSQL Azure в Microsoft Fabric

Указывает, соответствует ли шаблон регулярного выражения строке.

REGEXP_LIKE
(
    string_expression,
    pattern_expression [ , flags ]
)

REGEXP_LIKE требуется уровень совместимости базы данных 170 и более поздней версии. Если уровень совместимости базы данных ниже 170, REGEXP_LIKE он недоступен. Другие скалярные функции регулярного выражения доступны на всех уровнях совместимости.

Уровень совместимости можно проверить в sys.databases представлении или в свойствах базы данных. Вы можете изменить уровень совместимости базы данных с помощью следующей команды:

ALTER DATABASE [DatabaseName]
    SET COMPATIBILITY_LEVEL = 170;

Note

Регулярные выражения доступны в Управляемом экземпляре SQL Azure с помощью политики обновленияsql Server 2025 или Always-up-to-date.

Arguments

string_expression

Выражение символьной строки.

Может быть константой, переменной или столбцом символьной строки.

Типы данных: char, nchar nchar, varcharили nvarchar nvarchar.

Note

Функции поддерживают REGEXP_* типы LOB (varchar(max) и nvarchar(max)) до 2 МБ для параметра string_expression .

pattern_expression

Шаблон регулярного выражения для сопоставления. Обычно текстовый литерал.

Типы данных: char, nchar nchar, varcharили nvarchar nvarchar. pattern_expression поддерживает максимальную длину символов в 8 000 байт.

flags

Один или несколько символов, указывающих модификаторы, используемые для поиска совпадений. Тип varchar или charс не более чем 30 символами.

Например, ims. Значение по умолчанию — c. Если указана пустая строка (' '), она будет рассматриваться как значение по умолчанию ('c'). Укажите c или любые другие символьные выражения. Если флаг содержит несколько противоречивых символов, SQL Server использует последний символ.

Например, если указать ic regex возвращает соответствие регистра.

Если значение содержит символ, отличный от указанных в поддерживаемых значений флагов, запрос возвращает ошибку, как показано в следующем примере:

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Поддерживаемые значения флагов
Flag Description
i Без учета регистра (по умолчанию false)
m Многострочный режим: ^ и $ сопоставление начальной и конечной строки в дополнение к начальной и конечной строке (по умолчанию false)
s Разрешить . совпадение \n (по умолчанию false)
c Учет регистра (по умолчанию true)

Возвращаемое значение

Логическое значение. true или false.

Remarks

Оценка кратности

Для повышения точности оценки REGEXP_LIKE функции используйте ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP подсказки и ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP запроса для корректировки значений селективности по умолчанию. Дополнительные сведения см. в подсказках к запросам.

Эти подсказки по запросам также интегрируются с обратной связью по оценке мощности (CE). Модель обратной связи CE автоматически выявляет запросы, использующие эту REGEXP_LIKE функцию, при которой существует значительная разница между оценочным и фактическим количеством строк. Затем применяется соответствующее указание селекторности на уровне запроса для повышения качества плана без необходимости ввода вручную.

Чтобы отключить автоматическое поведение обратной связи, включите флаг трассировки 16268.

Поддержка SARGable паттернов

REGEXP_LIKE является SARGable только тогда, когда паттерн начинается с якоря ^. Кроме того, закреплённый узор может включать:

  • Квантор: *, +, ?, {n}{n,}, , или {n,m}. Например, ^ab+ или ^ab*.
  • Символы диапазона, такие как [0-9A-Za-z].

Чтобы уйти от метаперсонажа, используйте обратную черту (\).

Эти условия позволяют оптимизатору запросов использовать операции поиска индекса для повышения производительности запросов.

Регулярные выражения не уважают правила сопоставления. Их поведение может отличаться от других функций сравнения строк, таких LIKEкак . Это различие особенно важно для индексированных столбцов с языкоспецифическими коллегиями.

Например, в турецком сортировке символы i и I обрабатываются четко даже в нечувствительной сортировке регистра из-за правил, относящихся к языку. Для получения дополнительной информации см. пример F. Сравните сопоставление SARGable и non-SARGable паттернов с турецкой колляцией.

Note

Термин SARGable в реляционных базах данных обозначает предикат Search ARGumentable, для которого может использоваться индекс для ускорения выполнения запроса. Дополнительные сведения см. в руководстве по архитектуре и проектированию индексов SQL Sql Server и Azure.

Examples

А. Совпадение значений, которые начинаются и заканчиваются определёнными персонажами

Выберите Employees все записи из таблицы, где имя начинается и A заканчивается на Y:

SELECT *
FROM Employees
WHERE REGEXP_LIKE (FIRST_NAME, '^A.*Y$');

B. Выполните нечувствительное к регистру сопоставление паттернов

Выберите Employees все записи из таблицы, где имя начинается на A и заканчивается на Y, используя режим без регистра:

SELECT *
FROM Employees
WHERE REGEXP_LIKE (FIRST_NAME, '^A.*Y$', 'i');

С. Сопоставьте даты с помощью шаблона регулярных выражений

Выберите все записи из Orders таблицы, где дата заказа находится в феврале 2020 г.:

SELECT *
FROM Orders
WHERE REGEXP_LIKE (ORDER_DATE, '2020-02-\d\d');

D. Совпадение повторяющихся шаблонов персонажей

Выберите все записи из Products таблицы, в которой имя продукта содержит по крайней мере три последовательных гласных:

SELECT *
FROM Products
WHERE REGEXP_LIKE (PRODUCT_NAME, '[AEIOU]{3,}');

Д. Обеспечивать валидацию данных с ограничениями CHECK

Создайте таблицу сотрудников с CHECK ограничениями для Email столбцов и Phone_Number и:

DROP TABLE IF EXISTS Employees;
CREATE TABLE Employees
(
    ID INT IDENTITY (101, 1),
    [Name] VARCHAR (150),
    Email VARCHAR (320)
        CHECK (REGEXP_LIKE (Email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')),
    Phone_Number NVARCHAR (20)
        CHECK (REGEXP_LIKE (Phone_Number, '^(\d{3})-(\d{3})-(\d{4})$'))
);

F. Сравните сопоставление шаблонов SARGable и не-SARGable с турецкой колляцией

Этот пример демонстрирует использование функции в SARGable и неSARGable REGEXP_LIKE с турецкой колляцией.

-- Create a temporary table with Turkish collation and and an index
CREATE TABLE #Users
(
    Username NVARCHAR (100) COLLATE Turkish_100_CI_AS_SC_UTF8 NOT NULL,
    INDEX idx_username (Username)
);

-- Insert sample data
INSERT INTO #Users (Username)
VALUES (N'i'), -- lowercase i
       (N'I'), -- uppercase dotless I
       (N'İ'), -- uppercase dotted İ
       (N'abc');

-- SARGable pattern: starts with ^ and uses quantifier
-- This will use index seek if applicable, but REGEXP_LIKE ignores collation
-- So 'i' and 'I' are treated as different characters
SELECT 'SARGable' AS PatternType,
       *
FROM #Users
WHERE REGEXP_LIKE (Username, '^i');

-- Non-SARGable pattern: does not start with ^.
-- REGEXP_LIKE performs full scan, and matches are
-- case-insensitive since 'i' flag is supplied,
-- so both 'i' and 'I' match.
SELECT 'Non-SARGable' AS PatternType,
       *
FROM #Users
WHERE REGEXP_LIKE (Username, 'i', 'i');

-- Cleanup
DROP TABLE #Users;