You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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来处理两种结束情况(存在;或到字符串末尾),核心思路是:

  1. 先找到目标标记(如B:)的起始位置,计算内容的起始索引
  2. 查找该标记后第一个;的位置,如果找不到则用字符串总长度作为结束位置
  3. 用结束位置减去起始索引得到要提取的内容长度

提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:35:16