REGEXP_LIKE (Transact-SQL)

A következőkre vonatkozik: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL Database a Microsoft Fabricben

Azt jelzi, hogy a reguláris kifejezésminta egyezik-e egy sztringben.

REGEXP_LIKE
(
    string_expression,
    pattern_expression [ , flags ]
)

REGEXP_LIKE 170-es vagy újabb adatbázis-kompatibilitási szintet igényel. Ha az adatbázis kompatibilitási szintje 170-nél alacsonyabb, REGEXP_LIKE nem érhető el. A többi reguláris kifejezés skaláris függvénye minden kompatibilitási szinten elérhető.

A kompatibilitási szintet a nézetben vagy az sys.databases adatbázis tulajdonságaiban ellenőrizheti. Az adatbázis kompatibilitási szintjét az alábbi paranccsal módosíthatja:

ALTER DATABASE [DatabaseName]
    SET COMPATIBILITY_LEVEL = 170;

Note

A reguláris kifejezések az SQL Server 2025 vagy always-up-todátumfrissítési szabályzattal rendelkező felügyelt Azure SQL-példányban érhetők el.

Arguments

string_expression

Karaktersztring kifejezése.

Lehet állandó, változó vagy karaktersztring oszlopa.

Adattípusok: karakter, nchar, varcharvagy nvarchar.

Note

A REGEXP_* függvények támogatják az LOB típusokat (varchar(max) és nvarchar(max)) akár 2 MB-ig a string_expression paraméterhez.

pattern_expression

Egyező reguláris kifejezésminta. Általában szövegkonstans.

Adattípusok: karakter, nchar, varcharvagy nvarchar. pattern_expression legfeljebb 8000 bájt karakterhosszt támogat.

flags

Egy vagy több karakter, amely megadja az egyezések kereséséhez használt módosítókat. A típus varchar vagy karakter, legfeljebb 30 karakterből áll.

Például ims. Az alapértelmezett érték a c. Ha üres sztring (' ') van megadva, akkor a rendszer az alapértelmezett értékként kezeli ('c'). Adjon meg c vagy bármely más karakterkifejezést. Ha a jelölő több egymásnak ellentmondó karaktert tartalmaz, akkor az SQL Server az utolsó karaktert használja.

Ha például ic a regex megkülönbözteti a kis- és nagybetűket.

Ha az érték Támogatott jelölőértékeklistán felsoroltaktól eltérő karaktert tartalmaz, a lekérdezés az alábbi példához hasonló hibát ad vissza:

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Támogatott jelölőértékek
Flag Description
i Kis- és nagybetűk megkülönböztetése (alapértelmezett false)
m Többsoros mód: ^ és $ a kezdő/záró szöveg mellett egyezik a kezdő/záró vonallal (alapértelmezett false)
s Egyezés beállítása .\n (alapértelmezett false)
c Kis- és nagybetűk megkülönböztetése (alapértelmezett true)

Visszaadott érték

Logikai érték. true vagy false.

Remarks

Számosság becslése

A függvény kardinalitás-becslésénekREGEXP_LIKE pontosságának növelése érdekében használjuk a ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP és ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP lekérdezési tippeket az alapértelmezett szelektivitási értékek módosítására. További információ: Lekérdezési tippek.

Ezek a lekérdezési tippek integrálódnak a Cardinality Estimation (CE) visszajelzéssel is. A CE visszacsatolási modell automatikusan azonosítja azokat a lekérdezéseket, amelyek a REGEXP_LIKE függvényt használják, ahol jelentős különbség van a becsült és tényleges sorszám között. Ezután a megfelelő szelektivitási tippet alkalmazza a lekérdezés szintjén a tervminőség manuális bevitel nélkül történő javítása érdekében.

Az automatikus visszajelzési viselkedés letiltásához engedélyezze a nyomkövetési jelző 16268-at.

SARGable mintatámogatás

REGEXP_LIKE csak akkor SARGozható , ha a minta a horgonysal ^kezdődik. Ezen felül a rögzített minta tartalmazhatja:

  • Egy kvantifikátor: *, +, ?, {n}{n,}, vagy {n,m}. Például, ^ab+ vagy ^ab*.
  • Távolsági karakterek, például [0-9A-Za-z].

Egy metakarakter elől való elmeneküléshez használd a visszavágást (\).

Ezek a feltételek lehetővé teszik a lekérdezésoptimalizáló számára, hogy indexkereső műveleteket használjon a lekérdezések teljesítményének javítására.

A reguláris kifejezések nem tartják tiszteletben a kocolási szabályokat. Viselkedésük eltérhet más húrösszehasonlító függvényektől, például LIKE. Ez a különbség leginkább olyan indexelt oszlopoknál jelentkezik, amelyek nyelvspecifikus összeállításokat tartalmaznak.

A török rendezésben például a karaktereket i a nyelvspecifikus szabályok miatt a kis- és I nagybetűk megkülönböztetése esetén is külön kezelik. További információért lásd F példát. Hasonlítsa össze a SARGable és nem-SARGable minták párosítását a török összeállítással.

Note

A relációs adatbázisokban a SARGable kifejezés olyan Search ARGumentable predikátumot jelöl, amely indexet használhat a lekérdezés végrehajtásának felgyorsítására. További információ: SQL Server és Azure SQL indexarchitektúra és tervezési útmutató.

Examples

A. Olyan értékek, amelyek bizonyos karakterekkel kezdődnek és végződnek

Válassz Employees ki minden rekordot a táblázatból, ahol az első név a következő A betűkkel kezdődik és végződik Y:

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

B. Végezz egy kis- és kozik-érzékeny mintápárosítást

Válasszuk Employees ki az összes rekordot a táblázatból, ahol az első név kezdődik A és végződik Y, kis- és nagybetűs módban:

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

C. Egyeztetési dátumok reguláris kifejezési mintával

Válassza ki az összes rekordot abból a Orders táblából, ahol a rendelés dátuma 2020 februárjában van:

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

D. Ismételt karakterminták egyeztetése

Válassza ki az összes rekordot abból a Products táblából, amelyben a terméknév legalább három egymást követő magánhangzót tartalmaz:

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

E. Kényszerítsd be az adatellenőrzést CHECK korlátozásokkal

Készíts egy alkalmazotti táblázatot és CHECK oszlopok korlátaival 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. Hasonlítsd össze a SARGable és a nem SARGable minták párosítását a török összeállítással

Ez a példa a SARGable és nem SARGable REGEXP_LIKE funkció használatát mutatja a török kollektálással.

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