REGEXP_LIKE (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2025 (17.x) Microsoft Fabric'teAzure SQL VeritabanıAzure SQL Yönetilen Örneği SQL veritabanı

Normal ifade deseninin bir dizede eşleşip eşleşmediğini gösterir.

REGEXP_LIKE
(
    string_expression,
    pattern_expression [ , flags ]
)

REGEXP_LIKE veritabanı uyumluluk düzeyi 170 ve üzerini gerektirir. Veritabanı uyumluluk düzeyi 170'ten düşükse kullanılamaz REGEXP_LIKE . Diğer normal ifade skaler işlevleri tüm uyumluluk düzeylerinde kullanılabilir.

Uyumluluk düzeyini görünümde sys.databases veya veritabanı özelliklerinde de kontrol edebilirsiniz. Aşağıdaki komutla veritabanının uyumluluk düzeyini değiştirebilirsiniz:

ALTER DATABASE [DatabaseName]
    SET COMPATIBILITY_LEVEL = 170;

Note

Normal ifadeler Azure SQL Yönetilen Örneği'nde SQL Server 2025 veya Always-up-to-dategüncelleştirme ilkesiyle kullanılabilir.

Arguments

string_expression

Karakter dizesinin ifadesi.

Sabit, değişken veya karakter dizesi sütunu olabilir.

Veri türleri: char, nchar, varchar veya nvarchar.

Note

Fonksiyonlar, REGEXP_*string_expression parametresi için 2 MB'ye kadar LOB tiplerini (varchar(max) ve nvarchar(max)) destekler.

pattern_expression

Eşleşecek normal ifade deseni. Genellikle bir metin değişmez değeridir.

Veri türleri: char, nchar, varchar veya nvarchar. pattern_expression en fazla 8.000 bayt karakter uzunluğunu destekler.

flags

Eşleşmeleri aramak için kullanılan değiştiricileri belirten bir veya daha fazla karakter. Tür, en fazla 30 karakter içeren varchar veya char'tır.

Örneğin, ims. Varsayılan değer: c. Boş bir dize (' ') sağlanırsa, varsayılan değer ('c')olarak değerlendirilir. Veya c diğer karakter ifadelerini sağlayın. Bayrak birden çok çelişkili karakter içeriyorsa, SQL Server son karakteri kullanır.

Örneğin, regex değerini belirtirseniz ic büyük/küçük harfe duyarlı eşleştirme döndürür.

Değer , Desteklenen bayrak değerleri'nde listelenenlerden farklı bir karakter içeriyorsa, sorgu aşağıdaki örneğe benzer bir hata döndürür:

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Desteklenen bayrak değerleri
Flag Description
i Büyük/küçük harfe duyarlı değil (varsayılan false)
m Çok satırlı mod: ^ ve $ başlangıç/bitiş metnine ek olarak başlangıç/bitiş satırını eşleştir (varsayılan false)
s Eşleşmeye . izin ver \n (varsayılan false)
c Büyük/küçük harfe duyarlı (varsayılan true)

Dönüş değeri

Boole değeri. true veya false.

Remarks

Kardinalite tahmini

Fonksiyon için kardinalite tahminininREGEXP_LIKE doğruluğunu artırmak için, ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP ve ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP sorgu ipuçlarını kullanarak varsayılan seçicilik değerlerini ayarlayabilirsiniz. Daha fazla bilgi için bkz.sorgu ipuçları .

Bu sorgu ipuçları ayrıca Kardinalite tahmini (CE) geri bildirimiyle entegre olur. CE geri bildirim modeli, tahmini ve gerçek satır sayısı arasında önemli fark olduğu durumlarda fonksiyonu REGEXP_LIKE kullanan sorguları otomatik olarak belirler. Ardından, el ile giriş gerektirmeden plan kalitesini geliştirmek için sorgu düzeyinde uygun seçicilik ipucunu uygular.

Otomatik geri bildirim davranışını devre dışı bırakmak için izleme bayrağı 16268'i etkinleştirin.

SARGable desen desteği

REGEXP_LIKE SARGable olan sadece desen çapa ile başladığında ^geçerlidir. Ayrıca, sabitlenmiş desen şunları içerebilir:

  • Bir nicelikçi: *, +, ?, {n}, {n,}, veya {n,m}. Örneğin, ^ab+ veya ^ab*.
  • Menzil karakterleri, örneğin [0-9A-Za-z].

Metakarakterden kaçmak için ters çizgiyi (\). kullanın.

Bu koşullar, sorgu optimizatorunun sorgu performansını artırmak için indeks arama işlemlerini kullanmasına olanak tanır.

Düzenli ifadeler toplama kurallarına uymaz. Davranışları, diğer dize karşılaştırma fonksiyonlarından farklı olabilir, örneğin LIKE. Bu fark, dile özgü derlemelere sahip indeksli sütunlarda en önemli olanıdır.

Örneğin, Türkçe harmanlamada ve i karakterleriI, dile özgü kurallar nedeniyle büyük/küçük harfe duyarlı olmayan harmanlamada bile ayrı olarak ele alınıyor. Daha fazla bilgi için örnek F'ye bakınız. SARGable ve SARGable olmayan desen eşleştirmesi ile Türk derlemesini karşılaştırın.

Note

İlişkisel veritabanlarında SARGable terimi, sorgunun yürütülmesini hızlandırmak için bir dizin kullanabilen Search ARGumentable bir yüklemi ifade eder. Daha fazla bilgi için bkz. SQL Server ve Azure SQL dizin mimarisi ve tasarım kılavuzu.

Examples

A. Belirli karakterlerle başlayan ve biten değerleri eşleştirin

Tablodan tüm kayıtları Employees seçin; burada ilk ad ile A başlar ve sona Yerer:

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

B. Küçük harf duyarsız bir desen eşleşmesi gerçekleştirin

Tablodaki tüm kayıtları, ilk adın ile Employees başladığı ve bittiği Ayerde, küçük küçük harf duyarsız modda seçinY:

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

C. Düzenli ifade deseniyle eşleşme tarihleri

Sipariş tarihinin Şubat 2020'de olduğu tablodan tüm kayıtları Orders seçin:

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

D. Tekrarlanan karakter kalıplarını eşleştirin

Ürün adının en az üç ardışık sesli harf içerdiği tablodan tüm kayıtları Products seçin:

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

E. CHECK kısıtlamalarıyla veri doğrulamasını zorunlu kılın

ve CHECK sütunları için Email kısıtlamalarla bir çalışan tablosu Phone_Number oluşturun:

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. SARGable ve SARGable olmayan desen eşleştirmesini Türk derlemeleriyle karşılaştırın

Bu örnek, Türkçe derleme ile fonksiyonun SARGable ve SARG olmayan kullanımını REGEXP_LIKE göstermektedir.

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