REGEXP_LIKE (Transact-SQL)

Si applica a: Sql Server 2025 (17.x) DatabaseSQL di Azure Istanza gestita di SQL di Azurein Microsoft Fabric

Indica se il criterio di espressione regolare corrisponde a una stringa.

REGEXP_LIKE
(
    string_expression,
    pattern_expression [ , flags ]
)

REGEXP_LIKE richiede il livello di compatibilità del database 170 e versioni successive. Se il livello di compatibilità del database è inferiore a 170, REGEXP_LIKE non è disponibile. Altre funzioni scalari dell'espressione regolare sono disponibili a tutti i livelli di compatibilità.

È possibile controllare il livello di compatibilità nella sys.databases vista o nelle proprietà del database. È possibile modificare il livello di compatibilità di un database con il comando seguente:

ALTER DATABASE [DatabaseName]
    SET COMPATIBILITY_LEVEL = 170;

Note

Le espressioni regolari sono disponibili in Istanza gestita di SQL di Azure con i criteri di aggiornamentodi SQL Server 2025 o Always-up-to-date.

Arguments

string_expression

Espressione di una stringa di caratteri.

Può essere una costante, una variabile o una colonna di stringa di caratteri.

Tipi di dati: char, nchar, varcharo nvarchar.

Note

Le REGEXP_* funzioni supportano tipi LOB (varchar(max) e nvarchar(max)) fino a 2 MB per il parametro string_expression .

pattern_expression

Criterio di espressione regolare da trovare. In genere un valore letterale di testo.

Tipi di dati: char, nchar, varcharo nvarchar. pattern_expression supporta una lunghezza massima di caratteri di 8.000 byte.

flags

Uno o più caratteri che specificano i modificatori usati per la ricerca di corrispondenze. Il tipo è varchar o char, con un massimo di 30 caratteri.

Ad esempio, ims. Il valore predefinito è c. Se viene specificata una stringa vuota (' '), verrà considerata come valore predefinito ('c'). Specificare c o qualsiasi altra espressione di carattere. Se il flag contiene più caratteri contraddittori, SQL Server usa l'ultimo carattere.

Ad esempio, se si specifica ic l'espressione regolare restituisce la corrispondenza con distinzione tra maiuscole e minuscole.

Se il valore contiene un carattere diverso da quelli elencati in Valori flag supportati, la query restituisce un errore simile all'esempio seguente:

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Valori dei flag supportati
Flag Description
i Senza distinzione tra maiuscole e minuscole (impostazione predefinita false)
m Modalità a più righe: ^ e $ corrispondenza della riga iniziale/finale oltre al testo di inizio/fine (impostazione predefinita false)
s Let . match \n (impostazione predefinita false)
c Distinzione tra maiuscole e minuscole (impostazione predefinita true)

Valore restituito

Valore booleano. true o false.

Remarks

Stima della cardinalità

Per migliorare l'accuratezza della stima della cardinalità della REGEXP_LIKE funzione, usa i ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP suggerimenti e ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP query per regolare i valori di selettività predefiniti. Per ulteriori informazioni, vedere i suggerimenti di query .

Questi suggerimenti di query si integrano anche con il feedback per la stima della cardinalità (CE). Il modello di feedback CE identifica automaticamente le query che utilizzano la REGEXP_LIKE funzione dove c'è una differenza significativa tra il numero stimato e quello effettivo delle righe. Applica quindi l'hint di selettività appropriato a livello di query per migliorare la qualità del piano senza richiedere input manuale.

Per disabilitare il comportamento di feedback automatico, abilitare il flag di traccia 16268.

Supporto per pattern SARGable

REGEXP_LIKE è SARGable solo quando il pattern inizia con l'ancora ^. Inoltre, il motivo ancorato può includere:

  • Un quantificatore: *, +, ?, {n}, {n,}, o {n,m}. Ad esempio, ^ab+ o ^ab*.
  • Caratteri a intervallo, come [0-9A-Za-z].

Per sfuggire a un metapersonaggio, usa la barra inversa (\).

Queste condizioni permettono all'ottimizzatore di query di utilizzare operazioni di ricerca dell'indice per migliorare le prestazioni delle query.

Le espressioni regolari non rispettano le regole di collazione. Il loro comportamento potrebbe essere diverso da altre funzioni di confronto di stringhe, come LIKE. Questa differenza è più importante nelle colonne indicizzate che hanno collazioni specifiche per linguaggio.

Ad esempio, nelle regole di confronto turche, i caratteri i e I vengono trattati in modo distinto anche nelle regole di confronto senza distinzione tra maiuscole e minuscole a causa di regole specifiche della lingua. Per maggiori informazioni, vedi l'esempio F. Confronta il pattern matching SARGable e non-SARGable con la collation turca.

Note

Il termine SARGable nei database relazionali si riferisce a un predicato Search ARGumentable che può usare un indice per velocizzare l'esecuzione della query. Per altre informazioni, vedere Guida all'architettura e alla progettazione degli indici di SQL Server e Azure SQL.

Examples

A. Abbina valori che iniziano e finiscono con personaggi specifici

Seleziona tutti i record dalla Employees tabella dove il nome inizia A e termina con Y:

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

B. Esegui un pattern matching insensibile alla maiuscola

Seleziona tutti i record dalla Employees tabella dove il nome di battesimo inizia e A termina con Y, usando la modalità insensibile a maiuscole:

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

C. Date di corrispondenza usando un pattern di espressione regolare

Selezionare tutti i record dalla Orders tabella in cui la data dell'ordine è nel mese di febbraio 2020:

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

D. Abbina i pattern di carattere ripetuti

Selezionare tutti i record dalla Products tabella in cui il nome del prodotto contiene almeno tre vocali consecutive:

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

E. Imporre la validazione dei dati con vincoli CHECK

Crea una tabella dei dipendenti con CHECK vincoli per le Email colonne e Phone_Number di e:

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. Confronta il pattern matching SARGable e non-SARGable con la collation turca

Questo esempio dimostra l'uso SARGable e non SARGable della REGEXP_LIKE funzione con la collazione turca.

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