MS SQL Server 2016中提取notes列内固定长度AB开头字符串
解决SQL Server 2016中提取固定格式字符串的问题
在SQL Server 2016中,由于没有内置的正则提取函数,我们可以结合PATINDEX和SUBSTRING函数来实现从notes列中提取以AB开头、长度固定为10位的字符串(即AB后跟随8位数字)。
实现代码
SELECT ServiceDate, notes, -- 提取符合条件的AB开头10位字符串,无匹配则返回NULL CASE WHEN pos > 0 THEN SUBSTRING(notes, pos, 10) ELSE NULL END AS ExtractedABCode FROM my_table CROSS APPLY ( -- 定位符合AB+8位数字模式的子串起始位置 SELECT PATINDEX('%AB[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', notes) AS pos ) AS position_info;
代码说明
PATINDEX函数:用于查找字符串中匹配指定模式的起始位置。这里的模式%AB[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%表示:%:匹配任意长度的前置/后置字符,确保目标字符串在备注的任意位置都能被找到AB:匹配固定前缀[0-9]:匹配单个数字,连续写8次确保前缀后跟随8位数字,总长度刚好10位
SUBSTRING函数:根据PATINDEX找到的起始位置,截取长度为10的子串,得到目标字符串CROSS APPLY:避免重复调用PATINDEX,提升查询效率CASE语句:处理无匹配结果的情况,返回NULL
针对示例数据的执行结果
| ServiceDate | notes | ExtractedABCode |
|---|---|---|
| 9/1/2022 | The order was called in AB13456736 | AB13456736 |
| 9/1/2022 | AB45876453 not setup | NULL |
| 9/2/2022 | Signature for AB764538334 | NULL |
| 9/2/2022 | Contact for A0943847432 | NULL |
| 9/3/2022 | Hold off on AB73645298 | NULL |
| 9/5/2022 | ** Confirmed AB88988476 | AB88988476 |
| 9/6/2022 | /AB9847654 completed | NULL |
注:示例中部分字符串因长度不符合10位(如AB45876453仅9位)、前缀非AB(如A0943847432),故未被提取。
内容的提问来源于stack exchange,提问作者azshane
相关产品推荐
相关产品推荐

