如何利用CHARINDEX与LEN提取指定前缀后至分隔符或末尾的内容?
从结构化字符串中提取指定字段内容
首先是你的原始变量定义:
DECLARE @hello VARCHAR(100) = 'B:Technical Issue; L:XML; R:my-repo'
需求是分别提取三个标记后的内容:
- 提取
B:后的内容:返回Technical Issue - 提取
L:后的内容:返回XML - 提取
R:后的内容:返回my-repo(该标记后无;,需取到字符串末尾)
你之前针对B:的查询逻辑有误,问题出在结束位置的计算上——错误定位了后续的:而非当前标记后的;。完全可以通过CHARINDEX结合LEN来处理两种结束情况(存在;或到字符串末尾),核心思路是:
- 先找到目标标记(如
B:)的起始位置,计算内容的起始索引 - 查找该标记后第一个
;的位置,如果找不到则用字符串总长度作为结束位置 - 用结束位置减去起始索引得到要提取的内容长度
提取B:后的内容
SELECT SUBSTRING(@hello, CHARINDEX('B:', @hello) + 2, ISNULL(CHARINDEX(';', @hello, CHARINDEX('B:', @hello)), LEN(@hello) + 1) - CHARINDEX('B:', @hello) - 2) WHERE @hello LIKE '%B:%'
提取L:后的内容
SELECT SUBSTRING(@hello, CHARINDEX('L:', @hello) + 2, ISNULL(CHARINDEX(';', @hello, CHARINDEX('L:', @hello)), LEN(@hello) + 1) - CHARINDEX('L:', @hello) - 2) WHERE @hello LIKE '%L:%'
提取R:后的内容
SELECT SUBSTRING(@hello, CHARINDEX('R:', @hello) + 2, ISNULL(CHARINDEX(';', @hello, CHARINDEX('R:', @hello)), LEN(@hello) + 1) - CHARINDEX('R:', @hello) - 2) WHERE @hello LIKE '%R:%'
逻辑说明
CHARINDEX('B:', @hello) + 2:跳过B:两个字符,定位到内容的起始位置CHARINDEX(';', @hello, CHARINDEX('B:', @hello)):从B:的位置开始往后找第一个;的位置ISNULL(..., LEN(@hello) + 1):如果找不到;,就用字符串长度+1作为结束位置,确保SUBSTRING能取到最后一个字符- 最后用结束位置减去起始位置,得到要提取的内容长度
内容的提问来源于stack exchange,提问作者CalWall
相关产品推荐
相关产品推荐

