适用于:SQL Server 2025 (17.x) 在
Microsoft Fabric 预览版中预览
Azure SQL 数据库
Azure SQL 托管实例 SQL 数据库
Note
作为预览版功能,本文中介绍的技术受制于 Microsoft Azure 预览版补充使用条款。
指示正则表达式模式是否在字符串中匹配。
REGEXP_LIKE
(
string_expression,
pattern_expression [, flags ]
)
REGEXP_LIKE 需要数据库兼容性级别 170 及更高版本。 如果数据库兼容性级别低于 170, REGEXP_LIKE 则不可用。 其他 正则表达式标量函数 在所有兼容级别都可用。
可以在视图或数据库属性中 sys.databases 检查兼容性级别。 可以使用以下命令更改数据库的兼容性级别:
ALTER DATABASE [DatabaseName] SET COMPATIBILITY_LEVEL = 170;
Note
正则表达式在具有 SQL Server 2025 或 Always-up-to-date更新策略的 Azure SQL 托管实例中可用。
Arguments
string_expression
字符串的表达式。
可以是字符串的常量、变量或列。
数据类型: char、 nchar、 varchar 或 nvarchar。
Note
对于REGEXP_LIKEstring_expression参数,函数REGEXP_COUNT和REGEXP_INSTR函数支持 LOB 类型(varchar(max)和 nvarchar(max)最多 2 MB。
pattern_expression
要匹配的正则表达式模式。 通常是文本文本。
数据类型: char、 nchar、 varchar 或 nvarchar。 pattern_expression 支持最大字符长度为 8,000 字节。
flags
指定用于搜索匹配项的修饰符的一个或多个字符。 类型为 varchar 或 char,最多包含 30 个字符。
例如,ims。 默认值为 c。 如果提供了空字符串 (' ') ,它将被视为默认值 ('c')。 提供 c 或任何其他字符表达式。 如果标志包含多个相互矛盾的字符,则 SQL Server 使用最后一个字符。
例如,如果指定 ic 正则表达式返回区分大小写的匹配。
如果值包含除 受支持标志值中列出的字符以外的字符,则查询将返回如下例所示的错误:
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_REGEXP和ASSUME_FIXED_MAX_SELECTIVITY_FOR_REGEXP查询提示来调整默认的选择性值。 有关详细信息,请参阅 查询提示。
这些查询提示还与 基数估计(CE)反馈集成。 CE 反馈模型使用 REGEXP_LIKE 函数自动标识查询,其中估计行计数与实际行计数之间存在显著差异。 然后,它会在查询级别应用适当的选择性提示,以提高计划质量,而无需手动输入。
若要禁用自动反馈行为,请启用跟踪标志 16268。
Examples
从 Employees 表中选择名字开头 A 和结尾处的所有记录 Y
SELECT *
FROM Employees
WHERE REGEXP_LIKE (FIRST_NAME, '^A.*Y$');
从 Orders 表中选择订单日期在 2020 年 2 月的所有记录:
SELECT *
FROM Orders
WHERE REGEXP_LIKE (ORDER_DATE, '2020-02-\d\d');
从 Products 表中选择产品名称至少包含三个连续元音的所有记录:
SELECT *
FROM Products
WHERE REGEXP_LIKE (PRODUCT_NAME, '[AEIOU]{3,}');
创建包含约束CHECKEmail和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})$'))
);