REGEXP_LIKE (Transact-SQL)

Gäller för: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL Database i Microsoft Fabric

Anger om mönster för reguljära uttryck matchar i en sträng.

REGEXP_LIKE
(
    string_expression,
    pattern_expression [ , flags ]
)

REGEXP_LIKE kräver databaskompatibilitetsnivå 170 och senare. Om databasens kompatibilitetsnivå är lägre än 170 REGEXP_LIKE är den inte tillgänglig. Andra skalärfunktioner för reguljära uttryck är tillgängliga på alla kompatibilitetsnivåer.

Du kan kontrollera kompatibilitetsnivån i sys.databases vyn eller i databasegenskaperna. Du kan ändra kompatibilitetsnivån för en databas med följande kommando:

ALTER DATABASE [DatabaseName]
    SET COMPATIBILITY_LEVEL = 170;

Note

Reguljära uttryck är tillgängliga i Azure SQL Managed Instance med sql Server 2025- eller always-up-to-date update-principen.

Arguments

string_expression

Ett uttryck för en teckensträng.

Kan vara en konstant, variabel eller kolumn med teckensträng.

Datatyper: char, nchar, varchareller nvarchar.

Note

Funktionerna REGEXP_* stöder LOB-typer (varchar(max) och nvarchar(max)) upp till 2 MB för string_expression-parametern.

pattern_expression

Mönster för reguljära uttryck som ska matchas. Vanligtvis en textliteral.

Datatyper: char, nchar, varchareller nvarchar. pattern_expression stöder en maximal teckenlängd på 8 000 byte.

flags

Ett eller flera tecken som anger de modifierare som används för att söka efter matchningar. Typen är varchar eller tecken, med högst 30 tecken.

Till exempel ims. Standardvärdet är c. Om en tom sträng (' ') anges behandlas den som standardvärdet ('c'). Ange c eller andra teckenuttryck. Om flaggan innehåller flera motstridiga tecken använder SQL Server det sista tecknet.

Om du till exempel anger ic returnerar regex skiftlägeskänslig matchning.

Om värdet innehåller ett annat tecken än de som anges i flagga som stödsreturnerar frågan ett fel som liknar följande exempel:

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Flaggvärden som stöds
Flag Description
i Skiftlägesokänsligt (standard false)
m Flerradsläge: ^ och $ matcha start-/slutlinje utöver start-/sluttext (standard false)
s Låt . matcha \n (standard false)
c Skiftlägeskänsligt (standard true)

Returvärde

Booleskt värde. true eller false.

Remarks

Kardinalitetsuppskattning

För att förbättra noggrannheten i kardinalitetsuppskattning för REGEXP_LIKE funktionen, använd ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP och ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP frågeledtrådarna för att justera standardvärdena för selektivitet. Mer information finns i Frågetips.

Dessa frågeledtrådar integreras också med återkoppling från kardinalitetsskattning (CE). CE-återkopplingsmodellen identifierar automatiskt frågor som använder funktionen REGEXP_LIKE där det finns en betydande skillnad mellan uppskattade och faktiska radantal. Den tillämpar sedan lämplig selektivitetstips på frågenivå för att förbättra planens kvalitet utan att kräva manuella indata.

Om du vill inaktivera det automatiska feedbackbeteendet aktiverar du spårningsflagga 16268.

SARGable-mönsterstöd

REGEXP_LIKE är SARG-bar endast när mönstret börjar med ankaret ^. Dessutom kan det förankrade mönstret inkludera:

  • En kvantifikator: *, +, , ?, {n}, {n,}, eller {n,m}. Till exempel ^ab+ eller ^ab*.
  • Intervalltecken, såsom [0-9A-Za-z].

För att undkomma en metakaraktär, använd backslash (\).

Dessa villkor gör att frågeoptimeraren använder indexsökningsoperationer för att förbättra frågeprestandan.

Reguljära uttryck respekterar inte kollationsregler. Deras beteende kan skilja sig från andra strängjämförelsefunktioner, såsom LIKE. Denna skillnad är mest viktig på indexerade kolumner som har språkspecifika sorteringar.

I turkisk sortering behandlas till exempel tecknen i och I tydligt även i skiftlägesokänslig sortering på grund av språkspecifika regler. För mer information, se exempel F. Jämför SARGbar och icke-SARGbar mönstermatchning med turkisk kollation.

Note

Termen SARGable i relationsdatabaser refererar till ett Search ARGumentable-predikat som kan använda ett index för att påskynda exekveringen av SQL-frågan. Mer information finns i arkitektur och designguide för SQL Server- och Azure SQL-index.

Examples

A. Matcha värden som börjar och slutar med specifika karaktärer

Välj alla poster från Employees tabellen där förnamnet börjar med A och slutar på Y:

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

B. Utför en kasus-insensitiv mönstermatchning

Välj alla poster från Employees tabellen där förnamnet börjar med A och slutar på Y, med användning av kasuskänsligt läge:

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

C. Matchningsdatum med ett mönster av reguljära uttryck

Välj alla poster i tabellen Orders där orderdatumet är i februari 2020:

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

D. Matcha upprepade karaktärsmönster

Markera alla poster i tabellen Products där produktnamnet innehåller minst tre på varandra följande vokaler:

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

E. Upprätthåll datavalidering med CHECK-begränsningar

Skapa en employees-tabell med CHECK begränsningar för Email och Phone_Number kolumnerna:

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. Jämför mönstermatchning som kan användas för SARGbar och icke-SARGbar med turkisk sortering

Detta exempel visar SARGbar och icke-SARGbar användning av REGEXP_LIKE funktionen med turkisk sortering.

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