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
相关产品推荐
相关产品推荐

