共用方式為


REGEXP_LIKE (Transact-SQL)

適用於: SQL Server 2025 (17.x) Azure SQL Database AzureSQL Managed InstanceSQL 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

字元字串的表達式。

可以是字元字串的常數、變數或數據行。

數據類型: charncharvarcharnvarchar

Note

REGEXP_LIKE、 和REGEXP_COUNTREGEXP_INSTR函數支援 string_expression 參數的 LOB 類型 (varchar(max)nvarchar(max)) 最多 2 MB。

pattern_expression

要比對的正則表達式模式。 通常是文字常值。

數據類型: charncharvarcharnvarcharpattern_expression 支援最大字元長度 8,000 個字節。

flags

一或多個字元,指定用於搜尋相符專案的修飾詞。 類型為 varcharchar,最多 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

返回值

布林值。 truefalse

Remarks

基數估計

為了提升函數基數估計REGEXP_LIKE的準確度,請使用 和 ASSUME_FIXED_MIN_SELECTIVITY_FOR_REGEXPASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP 查詢提示來調整預設的選擇性值。 如需詳細資訊,請參閱 查詢提示

這些查詢提示同時也整合於 基數估計(CE)反饋。 CE 回饋模型會自動識別使用 REGEXP_LIKE 該函數且估計列數與實際列數有顯著差異的查詢。 然後,它會在查詢層級套用適當的選擇性提示,以改善計劃品質,而不需要手動輸入。

若要停用自動意見反應行為,請啟用追蹤旗標 16268。

Examples

Employees 表格中選取名字開頭 AY結尾的記錄:

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

使用大小寫不區分模式,從表中以 與 結尾AY的表格中選取所有Employees記錄:

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

從訂單日期為 2020 年 2 月的表格中 Orders 選取所有記錄:

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

從資料表中 Products 選取產品名稱至少包含三個連續元音的所有記錄:

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

建立一個員工資料表,並對 CHECKPhone_Number 欄位設Email限:

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})$'))
);