REGEXP_LIKE (Transact-SQL)

Berlaku untuk: Database SQL SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed Instancedi Microsoft Fabric

Menunjukkan apakah pola ekspresi reguler cocok dalam string.

REGEXP_LIKE
(
    string_expression,
    pattern_expression [ , flags ]
)

REGEXP_LIKE memerlukan tingkat kompatibilitas database 170 ke atas. Jika tingkat kompatibilitas database lebih rendah dari 170, REGEXP_LIKE tidak tersedia. Fungsi skalar ekspresi reguler lainnya tersedia di semua tingkat kompatibilitas.

Anda dapat memeriksa tingkat kompatibilitas dalam sys.databases tampilan atau di properti database. Anda bisa mengubah tingkat kompatibilitas database dengan perintah berikut:

ALTER DATABASE [DatabaseName]
    SET COMPATIBILITY_LEVEL = 170;

Note

Ekspresi reguler tersedia di Azure SQL Managed Instance dengan kebijakan pembaruanSQL Server 2025 atau Always-up-to-date.

Arguments

string_expression

Ekspresi string karakter.

Bisa berupa konstanta, variabel, atau kolom string karakter.

Jenis data: karakter, nchar, varchar , atau nvarchar.

Note

Fungsinya REGEXP_* mendukung jenis LOB (varchar(max) dan nvarchar(max)) hingga 2 MB untuk parameter string_expression .

pattern_expression

Pola ekspresi reguler untuk dicocokkan. Biasanya teks harfiah.

Jenis data: karakter, nchar, varchar , atau nvarchar. pattern_expression mendukung panjang karakter maksimum 8.000 byte.

flags

Satu atau beberapa karakter yang menentukan pengubah yang digunakan untuk mencari kecocokan. Jenisnya varchar atau karakter, dengan maksimum 30 karakter.

Misalnya, ims. Defaultnya adalah c. Jika string kosong (' ') disediakan, string tersebut akan diperlakukan sebagai nilai default ('c'). Berikan c atau ekspresi karakter lainnya. Jika bendera berisi beberapa karakter kontradiktif, maka SQL Server menggunakan karakter terakhir.

Misalnya, jika Anda menentukan ic regex mengembalikan pencocokan peka huruf besar/kecil.

Jika nilai berisi karakter selain yang tercantum di Nilai bendera yang didukung, kueri mengembalikan kesalahan seperti contoh berikut:

Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
Nilai bendera yang didukung
Flag Description
i Tidak peka huruf besar/kecil (default false)
m Mode multibaris: ^ dan $ cocokkan baris awal/akhir selain teks awal/akhir (default false)
s Biarkan . cocok \n (default false)
c Peka huruf besar/kecil (default true)

Mengembalikan nilai

Nilai Boolean. true atau false.

Remarks

Estimasi kardinalitas

Untuk meningkatkan akurasi estimasi kardinalitas untuk REGEXP_LIKE fungsi, gunakan ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXP petunjuk kueri dan ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP untuk menyesuaikan nilai selektivitas default. Untuk informasi selengkapnya, lihat petunjuk Kueri .

Petunjuk kueri ini juga terintegrasi dengan umpan balik estimasi Kardinalitas (CE). Model umpan balik CE secara otomatis mengidentifikasi kueri yang menggunakan fungsi di REGEXP_LIKE mana ada perbedaan signifikan antara jumlah baris perkiraan dan aktual. Kemudian menerapkan petunjuk selektivitas yang sesuai pada tingkat kueri untuk meningkatkan kualitas rencana tanpa memerlukan input manual.

Untuk menonaktifkan perilaku umpan balik otomatis, aktifkan bendera pelacakan 16268.

Dukungan pola SARGable

REGEXP_LIKE dapat SARGable hanya ketika pola dimulai dengan anchor ^. Selain itu, pola anchored dapat mencakup:

  • Sebuah kuantifier: *, , , {n}?, {n,}, atau {n,m}+. Misalnya, ^ab+ atau ^ab*.
  • Karakter rentang, seperti [0-9A-Za-z].

Untuk melarikan diri dari metakarakter, gunakan garis miring belakang (\).

Kondisi ini memungkinkan pengoptimal kueri menggunakan operasi pencarian indeks untuk meningkatkan kinerja kueri.

Ekspresi reguler tidak menghormati aturan kolasi. Perilaku mereka mungkin berbeda dari fungsi perbandingan string lainnya, seperti LIKE. Perbedaan ini paling penting pada kolom terindeks yang memiliki kolasi khusus bahasa.

Misalnya, dalam kolase Turki, karakter i dan I diperlakukan secara berbeda bahkan dalam kolase yang tidak peka huruf besar/kecil karena aturan khusus bahasa. Untuk informasi lebih lanjut, lihat contoh F. Bandingkan pencocokan pola SARGable dan non-SARGable dengan kolasi Turki.

Note

Istilah SARGable dalam basis data relasional mengacu pada predikat Search ARGumentable yang dapat menggunakan indeks untuk mempercepat eksekusi kueri. Untuk informasi selengkapnya, lihat Panduan arsitektur dan desain indeks SQL Server dan Azure SQL.

Examples

A. Cocokkan nilai yang dimulai dan diakhiri dengan karakter tertentu

Pilih semua catatan dari Employees tabel di mana nama depan dimulai dengan A dan diakhiri dengan Y:

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

B. Lakukan pencocokan pola tanpa huruf besar/kecil

Pilih semua rekaman dari tabel tempat nama depan dimulai dengan Employees dan diakhiri dengan A, menggunakan mode tidak peka huruf besar/kecil:Y

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

C. Cocokkan tanggal menggunakan pola ekspresi reguler

Pilih semua rekaman dari Orders tabel tempat tanggal pesanan pada Bulan Februari 2020:

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

D. Cocokkan pola karakter yang diulang

Pilih semua rekaman dari Products tabel di mana nama produk berisi setidaknya tiga vokal berturut-turut:

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

E. Menegakkan validasi data dengan batasan CHECK

Buat tabel karyawan dengan CHECK batasan untuk Email kolom dan 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. Bandingkan pencocokan pola SARGable dan non-SARGable dengan kolasi Turki

Contoh ini menunjukkan penggunaan REGEXP_LIKE fungsi yang dapat dan tidak dapat dilakukan oleh SARGable dengan kolasi bahasa Turki.

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