如何在SQL Server中用正则表达式提取指定模式字符串?
在SQL Server中使用正则提取字符串的解决方案
一、SQL Server原生是否有类似REGEXP_SUBSTR()的函数?
SQL Server没有原生的REGEXP_SUBSTR()函数,但可以通过组合PATINDEX()、SUBSTRING()、CHARINDEX()等系统函数实现等效的正则提取效果;如果有服务器权限,也可以通过CLR集成自定义正则函数。
二、提取目标温度值的具体实现
针对你提供的@message字符串,我们可以通过定位温度值前后的特征文本,结合函数组合精准提取每个日期对应的温度:
1. 定义测试变量
DECLARE @message NVARCHAR(MAX) = N'- Tomorrow: 75 degrees (bla xyz) - Day 1: 78 degrees etc 3300 fx - Day 2: 76 degrees ppp 99 - Day 3: 80 degrees xxx2 '; DECLARE @tomorrow_temperature NVARCHAR(10), @day_1_temperature NVARCHAR(10), @day_2_temperature NVARCHAR(10), @day_3_temperature NVARCHAR(10);
2. 逐个提取温度值
核心逻辑:用PATINDEX()定位温度值的起始位置,用CHARINDEX()找到温度值后的第一个空格确定截取长度,最后用SUBSTRING()提取目标内容。
提取Tomorrow的温度
SET @tomorrow_temperature = SUBSTRING( @message, PATINDEX('%Tomorrow: [0-9]%', @message) + LEN('Tomorrow: '), CHARINDEX(' ', @message, PATINDEX('%Tomorrow: [0-9]%', @message) + LEN('Tomorrow: ')) - (PATINDEX('%Tomorrow: [0-9]%', @message) + LEN('Tomorrow: ')) );
提取Day 1的温度
SET @day_1_temperature = SUBSTRING( @message, PATINDEX('%Day 1: [0-9]%', @message) + LEN('Day 1: '), CHARINDEX(' ', @message, PATINDEX('%Day 1: [0-9]%', @message) + LEN('Day 1: ')) - (PATINDEX('%Day 1: [0-9]%', @message) + LEN('Day 1: ')) );
提取Day 2的温度
SET @day_2_temperature = SUBSTRING( @message, PATINDEX('%Day 2: [0-9]%', @message) + LEN('Day 2: '), CHARINDEX(' ', @message, PATINDEX('%Day 2: [0-9]%', @message) + LEN('Day 2: ')) - (PATINDEX('%Day 2: [0-9]%', @message) + LEN('Day 2: ')) );
提取Day 3的温度
SET @day_3_temperature = SUBSTRING( @message, PATINDEX('%Day 3: [0-9]%', @message) + LEN('Day 3: '), CHARINDEX(' ', @message, PATINDEX('%Day 3: [0-9]%', @message) + LEN('Day 3: ')) - (PATINDEX('%Day 3: [0-9]%', @message) + LEN('Day 3: ')) );
3. 验证提取结果
SELECT @tomorrow_temperature AS tomorrow_temperature, @day_1_temperature AS day_1_temperature, @day_2_temperature AS day_2_temperature, @day_3_temperature AS day_3_temperature;
执行后会得到预期结果:
| tomorrow_temperature | day_1_temperature | day_2_temperature | day_3_temperature |
|---|---|---|---|
| 75 | 78 | 76 | 80 |
三、更通用的正则提取方案(CLR自定义函数)
如果需要频繁使用正则提取功能,可以通过SQL Server的CLR集成创建自定义的REGEXP_SUBSTR函数:
- 编写C#代码实现正则匹配逻辑
- 将代码编译为DLL文件
- 在SQL Server中启用CLR并注册该函数
注:此方法需要服务器管理员权限,且需注意安全配置。
内容的提问来源于stack exchange,提问作者Harry Kane
相关产品推荐
相关产品推荐

