REGEXP_LIKE (Transact-SQL)

Van toepassing op: SQL Server 2025 (17.x) AzureSQL Database Azure SQL Managed InstanceSQL-databasein Microsoft Fabric

Geeft aan of het reguliere expressiepatroon overeenkomt met een tekenreeks.

REGEXP_LIKE
(
    string_expression,
    pattern_expression [ , flags ]
)

REGEXP_LIKE vereist databasecompatibiliteitsniveau 170 en hoger. Als het compatibiliteitsniveau van de database lager is dan 170, REGEXP_LIKE is deze niet beschikbaar. Andere scalaire functies voor reguliere expressies zijn beschikbaar op alle compatibiliteitsniveaus.

U kunt het compatibiliteitsniveau in de sys.databases weergave of in database-eigenschappen controleren. U kunt het compatibiliteitsniveau van een database wijzigen met de volgende opdracht:

ALTER DATABASE [DatabaseName]
    SET COMPATIBILITY_LEVEL = 170;

Note

Reguliere expressies zijn beschikbaar in Azure SQL Managed Instance met het sql Server 2025- of Always-up-to-datumupdatebeleid.

Arguments

string_expression

Een expressie van een tekenreeks.

Dit kan een constante, variabele of kolom van tekenreeks zijn.

Gegevenstypen: teken, nchar, varcharof nvarchar.

Note

De REGEXP_* functies ondersteunen LOB-typen (varchar(max) en nvarchar(max)) tot 2 MB voor de string_expression-parameter .

pattern_expression

Patroon voor reguliere expressies dat overeenkomt. Meestal een letterlijke tekst.

Gegevenstypen: teken, nchar, varcharof nvarchar. pattern_expression ondersteunt een maximale tekenlengte van 8.000 bytes.

flags

Een of meer tekens die de modifiers opgeven die worden gebruikt voor het zoeken naar overeenkomsten. Het type is varchar of teken, met maximaal 30 tekens.

Bijvoorbeeld ims. De standaardwaarde is c. Als er een lege tekenreeks wordt opgegeven (' '), wordt deze behandeld als de standaardwaarde ('c'). Geef c of andere tekenexpressies op. Als de vlag meerdere tegenstrijdige tekens bevat, gebruikt SQL Server het laatste teken.

Als u bijvoorbeeld opgeeft ic de regex hoofdlettergevoelige overeenkomsten retourneert.

Als de waarde een ander teken bevat dan de waarden in Ondersteunde vlagwaarden, retourneert de query een fout zoals in het volgende voorbeeld:

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Ondersteunde vlagwaarden
Flag Description
i Hoofdlettergevoelig (standaard false)
m Modus met meerdere regels: ^ en $ begin-/eindregel vergelijken naast begin-/eindtekst (standaard false)
s Laten . overeenkomen \n (standaard false)
c Hoofdlettergevoelig (standaard true)

Retourwaarde

Booleaanse waarde. true of false.

Remarks

Kardinaliteitsraming

Om de nauwkeurigheid van de cardinaliteitsschatting voor de REGEXP_LIKE functie te verbeteren, gebruik je de ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP en ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP queryhints om de standaard selectiviteitswaarden aan te passen. Zie queryhintsvoor meer informatie.

Deze queryhints integreren ook met cardinaliteitsschatting (CE) feedback. Het CE-feedbackmodel identificeert automatisch zoekopdrachten die de REGEXP_LIKE functie gebruiken waarbij er een significant verschil is tussen geschatte en daadwerkelijke rijaantallen. Vervolgens wordt de juiste selectiviteitshint op queryniveau toegepast om de kwaliteit van het plan te verbeteren zonder handmatige invoer.

Als u het gedrag van automatische feedback wilt uitschakelen, schakelt u traceringsvlag 16268 in.

SARGable-patroon ondersteuning

REGEXP_LIKE is alleen SARG-baar wanneer het patroon begint met het anker ^. Daarnaast kan het verankerde patroon omvatten:

  • Een kwantor: *, , , ?, {n}, {n,}, of {n,m}+. Een voorbeeld hiervan is ^ab+ of ^ab*.
  • Bereikkarakters, zoals [0-9A-Za-z].

Om aan een metakarakter te ontsnappen, gebruik je de backslash (\).

Deze voorwaarden stellen de queryoptimizer in staat indexzoekoperaties te gebruiken om de queryprestaties te verbeteren.

Reguliere expressies houden zich niet aan de collatieregels. Hun gedrag kan verschillen van andere stringvergelijkingsfuncties, zoals LIKE. Dit verschil is het belangrijkst bij geïndexeerde kolommen die taalspecifieke collaties hebben.

In turkse sortering worden de tekens iI bijvoorbeeld afzonderlijk behandeld, zelfs in de hoofdlettergevoelige sortering vanwege taalspecifieke regels. Voor meer informatie, zie voorbeeld F. Vergelijk SARGable en niet-SARGable patroonmatching met Turkish collation.

Note

De term SARGable in relationele databases verwijst naar een Search ARGumentable-predicaat dat een index kan gebruiken om de uitvoering van de query te versnellen. Zie de architectuur en ontwerphandleiding voor SQL Server- en Azure SQL-indexen voor meer informatie.

Examples

Eén. Match waarden die beginnen en eindigen met specifieke personages

Selecteer alle records uit de Employees tabel waar de voornaam begint met A en eindigt met Y:

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

B. Voer een naam-insensitive patroonmatch uit

Selecteer alle records uit de Employees tabel waar de voornaam begint met A en eindigt met Y, met behulp van de hoofdletters ongevoelige modus:

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

C. Datum koppelen met behulp van een reguliere expressiepatroon

Selecteer alle records in de Orders tabel waarin de orderdatum zich in februari 2020 bevindt:

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

D. Herhaalde karakterpatronen matchen

Selecteer alle records in de Products tabel waarin de productnaam ten minste drie opeenvolgende klinkers bevat:

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

E. Handhaaf datavalidatie met CHECK-beperkingen

Maak een employee-tabel met CHECK beperkingen voor de en Email kolommenPhone_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. Vergelijk SARGable en niet-SARGable patroonmatching met Turkse collatie

Dit voorbeeld toont SARG-baar en niet-SARG-geschikt gebruik van de REGEXP_LIKE functie bij Turkse collatie.

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