適用於: SQL Server 2025 (17.x)
Azure SQL Database Azure
SQL Managed Instance
SQL database in Microsoft Fabric
指出正則表達式模式是否符合字串。
REGEXP_LIKE
(
string_expression,
pattern_expression [ , flags ]
)
REGEXP_LIKE 需要資料庫相容性層級 170 和更新版本。 如果資料庫相容性層級低於 170 REGEXP_LIKE ,則無法使用。 其他 正則表達式純量函 式適用於所有相容性層級。
您可以在檢視或資料庫屬性中檢查相容性層級 sys.databases 。 您可以使用下列命令來變更資料庫的相容性層級:
ALTER DATABASE [DatabaseName]
SET COMPATIBILITY_LEVEL = 170;
Note
規則運算式可在 Azure SQL 受控執行個體中使用 SQL Server 2025 或一 律up-to日期更新原則。
Arguments
string_expression
字元字串的表達式。
可以是字元字串的常數、變數或數據行。
數據類型: char、 nchar、 varchar 或 nvarchar。
Note
這些 REGEXP_* 函式支援 LOB 類型(varchar(max) 和 nvarchar(max)), string_expression 參數最多可達 2 MB。
pattern_expression
要比對的正則表達式模式。 通常是文字常值。
數據類型: char、 nchar、 varchar 或 nvarchar。 pattern_expression 支援最大字元長度 8,000 個字節。
flags
一或多個字元,指定用於搜尋相符專案的修飾詞。 類型為 varchar 或 char,最多 30 個字元。
例如: ims 。 預設值為 c。 如果提供空字串 (' ') ,則會將它視為預設值 ('c')。 提供 c 或任何其他字元表達式。 如果旗標包含多個相互矛盾的字元,則 SQL Server 會使用最後一個字元。
例如,如果您指定 ic regex 會傳回區分大小寫的比對。
如果值包含支援 旗標值所列的字元,查詢會傳回錯誤,如下列範例所示:
Invalid flag provided. '<invalid character>' are not valid flags. Only {c,i,s,m} flags are valid.
支援的旗標值
| Flag | Description |
|---|---|
i |
不區分大小寫 (預設值 false) |
m |
多行模式: ^ 與 $ 比對開始/結束文字之外,還比對開始/結束文字 (預設值 false) |
s |
讓 . 比對 \n (預設值 false) |
c |
區分大小寫 (預設值 true) |
返回值
布林值。
true 或 false。
Remarks
基數估計
為了提升函數基數估計REGEXP_LIKE的準確度,請使用 和 ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXPASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP 查詢提示來調整預設的選擇性值。 如需詳細資訊,請參閱 查詢提示。
這些查詢提示同時也整合於 基數估計(CE)反饋。 CE 回饋模型會自動識別使用 REGEXP_LIKE 該函數且估計列數與實際列數有顯著差異的查詢。 然後,它會在查詢層級套用適當的選擇性提示,以改善計劃品質,而不需要手動輸入。
若要停用自動意見反應行為,請啟用追蹤旗標 16268。
SARGable 模式支援
REGEXP_LIKE只有當模式以錨點^開始時才可 SARG。 此外,錨定模式還可包括:
- 一個量詞:
*, ,+?,{n},{n,}, , 或{n,m}。 例如,^ab+或^ab*。 - 範圍字元,例如
[0-9A-Za-z]。
要避開元字元,請使用反斜線(\)。
這些條件讓查詢優化器使用索引尋道操作來提升查詢效能。
正則表達式不尊重排序規則。 它們的行為可能與其他字串比較函數不同,例如 LIKE。 這種差異在具有語言特定排序的索引欄位中尤為重要。
例如,在土耳其文對照中,由於語言特定規則,即使在不區分大小寫的對照中,字元 i 和 I 也會以不同的方式處理。 更多資訊請參見 範例 F。比較 SARGable 與非 SARG 模式匹配與土耳其彙整。
Note
關聯式資料庫中的術語SARGable,是指可使用索引來加快查詢執行速度的 Search ARGumentable 述詞。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 索引架構和設計指南。
Examples
答: 匹配以特定字元開頭和結尾的數值
從 Employees 表格中選取名字開頭 A 與 Y結尾的記錄:
SELECT *
FROM Employees
WHERE REGEXP_LIKE (FIRST_NAME, '^A.*Y$');
B. 執行大小寫不區分的模式匹配
使用大小寫不區分模式,從表中以 與 結尾EmployeesA的表格中選取所有Y記錄:
SELECT *
FROM Employees
WHERE REGEXP_LIKE (FIRST_NAME, '^A.*Y$', 'i');
C. 使用正則表達式模式的配對日期
從訂單日期為 2020 年 2 月的表格中 Orders 選取所有記錄:
SELECT *
FROM Orders
WHERE REGEXP_LIKE (ORDER_DATE, '2020-02-\d\d');
D. 匹配重複的字元模式
從資料表中 Products 選取產品名稱至少包含三個連續元音的所有記錄:
SELECT *
FROM Products
WHERE REGEXP_LIKE (PRODUCT_NAME, '[AEIOU]{3,}');
E. 以 CHECK 約束強制資料驗證
建立一個員工資料表,並對 CHECK 和 Email 欄位設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. 比較 SARGable 與非 SARGable 模式匹配與土耳其式對照
此範例展示了該函數在土耳其式排序中可 REGEXP_LIKE SARGable與非SARG可使用的使用。
-- 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;