REGEXP_LIKE (Transact-SQL)

Dotyczy: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL Database w usłudze Microsoft Fabric

Wskazuje, czy wzorzec wyrażenia regularnego jest zgodny z ciągiem.

REGEXP_LIKE
(
    string_expression,
    pattern_expression [ , flags ]
)

REGEXP_LIKE wymaga zgodności bazy danych poziom 170 lub nowszy. Jeśli poziom zgodności bazy danych jest niższy niż 170, REGEXP_LIKE nie jest dostępny. Inne funkcje skalarne wyrażeń regularnych są dostępne na wszystkich poziomach zgodności.

Poziom zgodności można sprawdzić w sys.databases widoku lub we właściwościach bazy danych. Poziom zgodności bazy danych można zmienić za pomocą następującego polecenia:

ALTER DATABASE [DatabaseName]
    SET COMPATIBILITY_LEVEL = 170;

Note

Wyrażenia regularne są dostępne w usłudze Azure SQL Managed Instance z zasadami aktualizacjiprogramu SQL Server 2025 lub Always-up-to-date.

Arguments

string_expression

Wyrażenie ciągu znaków.

Może być stałą, zmienną lub kolumną ciągu znaków.

Typy danych: char, nchar, varcharlub nvarchar.

Note

Funkcje obsługują REGEXP_* typy LOB (varchar(max) i nvarchar(max)) do 2 MB dla parametru string_expression .

pattern_expression

Wzorzec wyrażenia regularnego do dopasowania. Zazwyczaj literał tekstu.

Typy danych: char, nchar, varcharlub nvarchar. pattern_expression obsługuje maksymalną długość znaków wynoszącą 8000 bajtów.

flags

Co najmniej jeden znak określający modyfikatory używane do wyszukiwania dopasowań. Typem jest varchar lub znak, z maksymalnie 30 znakami.

Na przykład ims. Wartość domyślna to c. Jeśli zostanie podany pusty ciąg (' '), będzie on traktowany jako wartość domyślna ('c'). Podaj c lub inne wyrażenia znaków. Jeśli flaga zawiera wiele sprzecznych znaków, program SQL Server używa ostatniego znaku.

Jeśli na przykład określisz ic regex zwraca dopasowanie uwzględniające wielkość liter.

Jeśli wartość zawiera znak inny niż wymienione na Obsługiwane wartości flagi, zapytanie zwraca błąd podobny do następującego przykładu:

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Obsługiwane wartości flagi
Flag Description
i Bez uwzględniania wielkości liter (wartość domyślna false)
m Tryb wielowierszowy: ^ i $ dopasuj wiersz początkowy/końcowy oprócz tekstu rozpoczynającego/końcowego (wartość domyślna false)
s Dopasuj .\n (ustawienie domyślne false)
c Uwzględniana wielkość liter (wartość domyślna true)

Wartość zwracana

Wartość logiczna. true lub false.

Remarks

Szacowanie kardynalności

Aby zwiększyć dokładność oszacowaniaREGEXP_LIKE kardynalności funkcji, użyj ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP wskazówek i ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP zapytania do korekty domyślnych wartości selektywności. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące zapytań.

Te podpowiedzi zapytań integrują się również ze sprzężeniem zwrotnym z estymacji kardynalności (CE). Model informacji zwrotnej CE automatycznie identyfikuje zapytania wykorzystujące REGEXP_LIKE tę funkcję, w których istnieje istotna różnica między szacowaną a faktyczną liczbą wierszy. Następnie stosuje odpowiednią wskazówkę wyboru na poziomie zapytania, aby poprawić jakość planu bez konieczności ręcznego wprowadzania danych wejściowych.

Aby wyłączyć automatyczne zachowanie opinii, włącz flagę śledzenia 16268.

Wsparcie wzorców SARGable

REGEXP_LIKE jest SARGowalna tylko wtedy, gdy wzór zaczyna się od kotwicy ^. Ponadto wzorzec zakotwiczenia może obejmować:

  • Kwantyfikator: , , , , {n}, {n,}, lub {n,m}. ?+* Na przykład: ^ab+ lub ^ab*.
  • Znaki zakresu, takie jak [0-9A-Za-z].

Aby uciec od metapostaci, użyj ukośnika (\).

Te warunki pozwalają optymalizatorowi zapytań używać operacji wyszukiwania indeksu w celu poprawy wydajności zapytań.

Wyrażenia regularne nie przestrzegają zasad sortowania. Ich zachowanie może różnić się od innych funkcji porównania ciągów znaków, takich jak LIKE. Ta różnica jest najważniejsza w kolumnach indeksowanych, które mają kolacji specyficzne dla języka.

Na przykład w sortowaniu tureckim znaki i i I są traktowane wyraźnie nawet w przypadku sortowania bez uwzględniania wielkości liter z powodu reguł specyficznych dla języka. Więcej informacji można znaleźć w przykładzie F. Porównaj dopasowanie wzorców SARGable i nieSARGable z turecką kolacją.

Note

Termin SARGable w relacyjnych bazach danych odnosi się do predykatu Search ARGumentable, który może wykorzystywać indeks do przyspieszenia wykonania zapytania. Aby uzyskać więcej informacji, zobacz Sql Server i Azure SQL index architecture and design guide (Architektura i projektowanie indeksów usługi Azure SQL).

Examples

A. Wartości dopasowania, które zaczynają się i kończą na konkretnych postaciach

Wybierz wszystkie rekordy z tabeli, Employees w której imię zaczyna się na A i kończy na Y:

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

B. Wykonaj dopasowanie wzorców nierozróżniających wielkości liter

Wybierz wszystkie rekordy z tabeli, Employees w której nazwa zaczyna się na A , a kończy na Y, używając trybu nierozróżniającego wielka litera:

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

C. Dopasuj daty za pomocą wzorca wyrażeń regularnych

Wybierz wszystkie rekordy z Orders tabeli, w której data zamówienia przypada w lutym 2020 r.:

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

D. Dopasowuj powtarzające się wzorce znaków

Zaznacz wszystkie rekordy z Products tabeli, w której nazwa produktu zawiera co najmniej trzy kolejne śluby:

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

E. Wymuszenie walidacji danych za pomocą ograniczeń CHECK

Stwórz tabelę pracowników z CHECK ograniczeniami dla kolumn i EmailPhone_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. Porównaj dopasowanie wzorców SARGable i nie-SARGable z turecką sortacją

Ten przykład demonstruje użycie funkcji REGEXP_LIKE SARGable i nieSARGable przy użyciu tureckiej kolacji.

-- 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;