获取已知字符串的第 2 个和第 3 个实例之间的字符串

Get a string between the 2nd and 3rd instances of a known string

提问人:marky 提问时间:3/25/2023 更新时间:3/25/2023 访问量:29

问:

给定字符串,我需要获取第二个和第三个之间的值。即.'aaaaa$bbbbb$ccccc$ddddd'$ccccc

有一个 SO 问题给了我一个很好的起点,但我还没有完全到位。(很抱歉,我有这个问题的页面,做了一些搜索,然后在我的历史记录中丢失了它。否则,我会包含该问题的链接。

该问题中的 OP 需要从 .答案是这样的代码:bbbbbaaaa$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()

T-SQL 子字符串 charindex

评论

0赞 Patrick Hurst 3/25/2023
您使用的是哪个版本的 SQL Server?
0赞 marky 3/25/2023
@PatrickHurst,对不起 - 这是在 ADW 中
0赞 Patrick Hurst 3/25/2023
你能发布跑步的结果吗?SELECT @@VERSION
0赞 marky 3/25/2023
Microsoft Azure SQL 数据仓库 - 10.0.20438.0 2023 年 1 月 10 日 20:57:20 版权所有 (c) Microsoft Corporation

答:

3赞 Patrick Hurst 3/25/2023 #1

如果将其视为字符串拆分,则要简单得多:

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

评论

0赞 marky 3/25/2023
谢谢帕特里克。我把它打到我的表查询中,它就像一个魅力。我知道这是一个获得正确的 CHARINDEX 值来对 SUBSTRING 函数进行“数学运算”的问题,像您一样分解它,但无法完全到达那里。