Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: SQL Server 2025 (17.x)
Azure SQL Database Azure SQL
Managed Instance
SQL Database v Microsoft Fabric
Určuje, jestli vzor regulárního výrazu odpovídá v řetězci.
REGEXP_LIKE
(
string_expression,
pattern_expression [ , flags ]
)
REGEXP_LIKE vyžaduje úroveň kompatibility databáze 170 a vyšší. Pokud je úroveň kompatibility databáze nižší než 170, REGEXP_LIKE není dostupná. Další skalární funkce regulárních výrazů jsou k dispozici na všech úrovních kompatibility.
Úroveň kompatibility sys.databases můžete zkontrolovat v zobrazení nebo ve vlastnostech databáze. Úroveň kompatibility databáze můžete změnit pomocí následujícího příkazu:
ALTER DATABASE [DatabaseName]
SET COMPATIBILITY_LEVEL = 170;
Note
Regulární výrazy jsou k dispozici ve službě Azure SQL Managed Instance se zásadami aktualizaceSQL Serveru 2025 nebo Always-up-to-date.
Arguments
string_expression
Výraz řetězce znaků.
Může to být konstanta, proměnná nebo sloupec řetězce znaků.
Datové typy: char, nchar, varcharnebo nvarchar.
Note
Funkce REGEXP_* podporují typy LOB (varchar(max) a nvarchar(max)) až do 2 MB pro string_expression parametr.
pattern_expression
Vzor regulárního výrazu, který se má shodovat. Obvykle textový literál.
Datové typy: char, nchar, varcharnebo nvarchar. pattern_expression podporuje maximální délku znaků 8 000 bajtů.
flags
Jeden nebo více znaků, které určují modifikátory používané k hledání shod. Typ je varchar nebo znak, s maximálně 30 znaky.
Například ims. Výchozí hodnota je c. Pokud je zadaný prázdný řetězec (' '), bude považován za výchozí hodnotu ('c'). Zadejte c nebo jiné výrazy znaků. Pokud příznak obsahuje více protichůdných znaků, sql Server použije poslední znak.
Pokud například zadáte ic regulární výraz vrátí porovnávání s rozlišováním velkých a malých písmen.
Pokud hodnota obsahuje jiný znak než ty uvedené v podporované hodnoty příznaku, dotaz vrátí chybu jako v následujícím příkladu:
Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Podporované hodnoty příznaku
| Flag | Description |
|---|---|
i |
Nerozlišují se malá a velká písmena (výchozí false) |
m |
Režim více řádků: ^ a $ porovná počáteční/koncový řádek kromě počátečního/koncového textu (výchozí false) |
s |
Nechte . odpovídat \n (výchozí false) |
c |
Malá a velká písmena (výchozí true) |
Návratová hodnota
Logická hodnota
true nebo false.
Remarks
Odhad kardinalita
Pro zvýšení přesnosti odhaduREGEXP_LIKE kardinálnosti pro funkci použijte ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP hint a ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP dotaz k úpravě výchozích hodnot selektivity. Další informace najdete v tématu nápovědy k dotazům.
Tyto dotazové nápovědy se také integrují se zpětnou vazbou z odhadu kardinality (CE). CE zpětná vazba automaticky identifikuje dotazy, které funkci používají REGEXP_LIKE , kde je významný rozdíl mezi odhadovaným a skutečným počtem řádků. Potom použije odpovídající tip selektivity na úrovni dotazu, aby se zlepšila kvalita plánu bez nutnosti ručního vstupu.
Pokud chcete chování automatické zpětné vazby zakázat, povolte příznak trasování 16268.
Podpora vzorů SARGable
REGEXP_LIKE je SARGable pouze tehdy, když vzor začíná kotvou ^. Kromě toho může ukotvený vzor zahrnovat:
- Kvantifikátor:
*,+,?, ,{n},{n,}, nebo{n,m}. Například^ab+nebo^ab*. - Znaky rozsahu, například
[0-9A-Za-z].
Pro únik z metaznaku použijte zpětné lomítko (\).
Tyto podmínky umožňují optimalizátoru dotazů používat operace indexového vyhledávání ke zlepšení výkonu dotazů.
Regulární výrazy nerespektují pravidla třídění. Jejich chování se může lišit od jiných funkcí porovnání řetězců, například LIKE. Tento rozdíl je nejdůležitější u indexovaných sloupců, které mají jazykově specifické kolace.
Například v turečtině kolace jsou znaky i a I jsou považovány za odlišné i v kolaci nerozlišující malá a velká písmena z důvodu pravidel specifických pro jazyk. Pro více informací viz příklad F. Porovnejte SARGable a non-SARGable pattern matching s tureckou kolací.
Note
Termín SARGable v relačních databázích odkazuje na predikát typu Search ARGumentable, který může použít index ke zrychlení provádění dotazu. Další informace najdete v článku Průvodce architekturou a návrhem indexů v SQL Serveru a Azure SQL.
Examples
A. Hodnoty shody, které začínají a končí u konkrétních postav
Vyberte všechny záznamy z tabulky Employees , kde křestní jméno začíná a končí na AY:
SELECT *
FROM Employees
WHERE REGEXP_LIKE (FIRST_NAME, '^A.*Y$');
B. Proveďte vzorovou shodu bez rozlišení velikosti
Vyberte všechny záznamy z tabulky Employees , kde křestní jméno začíná a končí na AY, pomocí režimu bez rozlišení velkých písmen:
SELECT *
FROM Employees
WHERE REGEXP_LIKE (FIRST_NAME, '^A.*Y$', 'i');
C. Párování dat pomocí pravidelného výrazového vzoru
Vyberte všechny záznamy z Orders tabulky, ve které je datum objednávky v únoru 2020:
SELECT *
FROM Orders
WHERE REGEXP_LIKE (ORDER_DATE, '2020-02-\d\d');
D. Přizpůsobte se opakujícím se vzorům znaků
Vyberte všechny záznamy z Products tabulky, kde název produktu obsahuje alespoň tři po sobě jdoucí samohlásky:
SELECT *
FROM Products
WHERE REGEXP_LIKE (PRODUCT_NAME, '[AEIOU]{3,}');
E. Vynucování validace dat pomocí omezení CHECK
Vytvořte tabulku zaměstnanců s CHECK omezeními pro Email sloupce a 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. Porovnejte SARGable a ne-SARGable pattern matching s tureckou kolací
Tento příklad ukazuje použití funkce REGEXP_LIKE SARGable i non-SARGable s tureckou srovnáním.
-- 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;