如何在SQL中提取以'lat'开头且到首个空格结束的字符串
提取JobName中以'lat'开头的单词
问题分析
你当前的SQL语句会从lat出现的位置一直截取到字符串末尾,无法识别单词的结束边界(比如空格、-、(这类分隔符)。要解决这个问题,关键是找到lat开头单词的结束位置,再精准截取。
解决方案1:通过查找分隔符确定截取长度
利用CHARINDEX查找lat之后第一个出现的分隔符(空格、-、(),以此作为单词的结束位置,计算截取长度:
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, JobName VARCHAR(MAX)); INSERT INTO @tbl (JobName) VALUES ('pl_blob_consolidated - latship'), ('pl_blob - latprod'), ('pl_blob - latdfu - final'), ('pl_blob - latdfu (final_blob)'), ('pl_blob - latdfu - final_blob - sql'); SELECT SUBSTRING( JobName, CHARINDEX('lat', JobName), COALESCE( -- 优先取lat后的第一个空格位置 NULLIF(CHARINDEX(' ', JobName, CHARINDEX('lat', JobName)), 0) - CHARINDEX('lat', JobName), -- 其次取lat后的第一个减号位置 NULLIF(CHARINDEX('-', JobName, CHARINDEX('lat', JobName)), 0) - CHARINDEX('lat', JobName), -- 再取lat后的第一个左括号位置 NULLIF(CHARINDEX('(', JobName, CHARINDEX('lat', JobName)), 0) - CHARINDEX('lat', JobName), -- 如果没有分隔符,取到字符串末尾 LEN(JobName) - CHARINDEX('lat', JobName) + 1 ) ) AS JobName FROM @tbl;
解决方案2:使用正则匹配(PATINDEX)
通过PATINDEX匹配lat开头、后续为字母/数字/下划线的单词,直接定位截取范围:
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, JobName VARCHAR(MAX)); INSERT INTO @tbl (JobName) VALUES ('pl_blob_consolidated - latship'), ('pl_blob - latprod'), ('pl_blob - latdfu - final'), ('pl_blob - latdfu (final_blob)'), ('pl_blob - latdfu - final_blob - sql'); SELECT SUBSTRING( JobName, lat_start_pos, COALESCE( NULLIF(PATINDEX('%[^a-z0-9_]%', SUBSTRING(JobName, lat_start_pos, LEN(JobName))), 0) - 1, LEN(JobName) - lat_start_pos + 1 ) ) AS JobName FROM ( SELECT JobName, PATINDEX('%lat%', JobName) AS lat_start_pos FROM @tbl ) t WHERE lat_start_pos > 0;
输出结果
两种方法均会返回你期望的结果:
| JobName |
|---|
| latship |
| latprod |
| latdfu |
| latdfu |
| latdfu |
内容的提问来源于stack exchange,提问作者vedant
相关产品推荐
相关产品推荐

