提问人:marky 提问时间:3/25/2023 更新时间:3/25/2023 访问量:29
获取已知字符串的第 2 个和第 3 个实例之间的字符串
Get a string between the 2nd and 3rd instances of a known string
问:
给定字符串,我需要获取第二个和第三个之间的值。即.'aaaaa$bbbbb$ccccc$ddddd'
$
ccccc
有一个 SO 问题给了我一个很好的起点,但我还没有完全到位。(很抱歉,我有这个问题的页面,做了一些搜索,然后在我的历史记录中丢失了它。否则,我会包含该问题的链接。
该问题中的 OP 需要从 .答案是这样的代码:bbbbb
aaaa$bbbbb$ccccc
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
我把它计算成这个当前的代码:
SUBSTRING('aaaaa$bbbbb$ccccc$ddddd', CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd') + 1, CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd', CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd') + 1 + CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd') + 1) - CHARINDEX('$', 'aaaaa$bbbbb$ccccc$ddddd') - 1) as My_String
哪个回来了bbbbb$ccccc
所以我想我既没有第二个,也没有 corret 的减法部分。CHARINDEX()
CHARINDEX()
SUBSTRING()
答:
如果将其视为字符串拆分,则要简单得多:
SELECT value
FROM STRING_SPLIT(@string,'$',1)
WHERE ordinal = 3
如果必须将其作为字符串操作来执行,则可以使用:
SELECT @string,
CHARINDEX('$',@string, CHARINDEX('$',@string)+1) AS SecondOccurrence Position,
CHARINDEX('$',@string,CHARINDEX('$',@string, CHARINDEX('$',@string)+1)+1) AS ThirdOccurrence Position,
SUBSTRING(@string,CHARINDEX('$',@string, CHARINDEX('$',@string)+1)+1,CHARINDEX('$',@string,CHARINDEX('$',@string, CHARINDEX('$',@string)+1)+1)-CHARINDEX('$',@string, CHARINDEX('$',@string)+1)-1)
我们在这里所做的是查找第二个匹配项,将 CHARINDEX 与可选的第三个参数 Start Position 一起使用,并提供第一个匹配项的位置。然后我们再次做同样的事情,复合 CHARINDEX 提供第二次出现的位置作为起始位置。
现在我们知道了这两个位置,我们可以使用它们来提供起始位置(第一次出现位置 +1)和长度(第三次出现 - 第二次出现)。SUBSTRING
评论
SELECT @@VERSION