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

SQL中如何提取字符串第2个与第3个$之间的子串?

提取字符串中第2个与第3个$之间的内容(SQL实现)

给定字符串 'aaaaa$bbbbb$ccccc$ddddd',需要提取第2个和第3个$之间的内容ccccc。

此前参考过一段SQL代码,用于从'aaaa$bbbbb$ccccc'中提取bbbbb,代码如下:

SELECT SUBSTRING('aaaaa$bbbbb$ccccc', CHARINDEX('$', 'aaaaa$bbbbb$ccccc') + 1, CHARINDEX('$', 'aaaaa$bbbbb$ccccc', CHARINDEX('$', 'aaaaa$bbbbb$ccccc') + 1) - CHARINDEX('$', 'aaaaa$bbbbb$ccccc') - 1) as My_String

自行修改后的代码返回结果为bbbbb$ccccc,问题出在CHARINDEX()的嵌套逻辑错误——错误地将前两个$的位置相加作为第3个$的搜索起始位,导致截取范围超出预期。

正确实现方法

方法1:嵌套CHARINDEX直接实现

SELECT SUBSTRING(
    'aaaaa$bbbbb$ccccc$ddddd',
    -- 起始位置:第2个$的位置 + 1
    CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd', CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd') + 1) + 1,
    -- 截取长度:第3个$的位置 - 第2个$的位置 - 1
    CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd', CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd', CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd') + 1) + 1) 
    - CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd', CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd') + 1) 
    - 1
) AS My_String;

方法2:使用变量存储中间位置(可读性更高)

DECLARE @target_str VARCHAR(100) = 'aaaaa$bbbbb$ccccc$ddddd';
-- 定位第2个$的位置
DECLARE @second_dollar_pos INT = CHARINDEX('$', @target_str, CHARINDEX('$', @target_str) + 1);
-- 定位第3个$的位置
DECLARE @third_dollar_pos INT = CHARINDEX('$', @target_str, @second_dollar_pos + 1);

SELECT SUBSTRING(@target_str, @second_dollar_pos + 1, @third_dollar_pos - @second_dollar_pos - 1) AS My_String;

两种方法最终都会返回预期结果ccccc。

内容的提问来源于stack exchange,提问作者marky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:32:30