如何在SQL中提取特定字符串(.svg)前的紧邻字符?
提取文本中每个.svg前指定片段的SQL方法
针对你提供的tempTable表,要提取每个.svg扩展名及其前面紧邻的指定片段,可通过递归CTE结合字符串函数实现,具体代码如下:
WITH SVGPositions AS ( -- 获取每条记录中第一个.svg的位置 SELECT pkid, text AS original_text, CHARINDEX('.svg', text) AS svg_start_pos FROM tempTable WHERE CHARINDEX('.svg', text) > 0 UNION ALL -- 递归查找后续所有.svg的位置 SELECT pkid, original_text, CHARINDEX('.svg', original_text, svg_start_pos + 4) AS svg_start_pos FROM SVGPositions WHERE CHARINDEX('.svg', original_text, svg_start_pos + 4) > 0 ) SELECT SUBSTRING( original_text, -- 计算提取起始位置:找到.svg前最后一个空格,取空格前3位开始,不足则从文本开头取 MAX(1, (svg_start_pos - 1 - CHARINDEX(' ', REVERSE(SUBSTRING(original_text, 1, svg_start_pos - 1)))) - 3), -- 计算提取长度:从起始位置到.svg结束的总长度 (svg_start_pos + 3) - MAX(1, (svg_start_pos - 1 - CHARINDEX(' ', REVERSE(SUBSTRING(original_text, 1, svg_start_pos - 1)))) - 3) + 1 ) AS result FROM SVGPositions;
代码逻辑说明
- 递归CTE遍历所有.svg位置:
- 初始步骤筛选出包含.svg的记录,获取第一个.svg的起始位置(即
.的位置)。 - 递归步骤不断从当前.svg位置之后查找下一个.svg,直到文本中无更多.svg为止,确保每个.svg都能被单独处理。
- 初始步骤筛选出包含.svg的记录,获取第一个.svg的起始位置(即
- 精准截取目标片段:
- 通过
REVERSE反转.svg前的文本,再用CHARINDEX找到反转后第一个空格的位置,以此定位原文本中.svg前最后一个空格的位置,从而关联到文件名前的单词。 - 从该空格位置往前3位开始截取,到.svg的结束位置(
.svg共4个字符,结束位置为svg_start_pos + 3),确保得到类似ike image1.svg的结果;若空格前不足3个字符,则从文本开头截取。
- 通过
运行上述代码后,将得到你期望的3行结果,每个.svg对应一条目标片段。
内容的提问来源于stack exchange,提问作者Edgedancer
相关产品推荐
相关产品推荐

