【问题标题】:How to extract specific text between the second and the third "_" with CHARINDEX and SUBSTRING?如何使用 CHARINDEX 和 SUBSTRING 提取第二个和第三个“_”之间的特定文本?
【发布时间】:2016-11-03 14:13:57
【问题描述】:

如何编写 SQL 脚本以从“Email_Transport_Cabforce_NEB_Fallback_LB”中获取“Cabforce”?

我在下面找到了获取第一个 _ 和最后一个 _ 之间所有单词的解决方案,但未能将其转换为第二个 _ 和第三个 _ 之间的字符串。

DECLARE @c varchar(100)
SET     @c = 'Email_Transport_Cabforce_NEB_Fallback_LB' 

SELECT SUBSTRING(
    @c, 
    CHARINDEX('_', @c) + 1, 
    LEN(@c) - CHARINDEX('_', @c) - CHARINDEX('_', REVERSE(@c))
)

【问题讨论】:

  • 你的问题应该更具体。

标签: string sql-server-2008 charindex


【解决方案1】:

这有点啰嗦,但你可以这样做。它找到第一个下划线的位置,然后将其用作下一次CHARINDEX 计算的开始。然后它再次为第三个CHARINDEX 执行此操作。最后两次计算的结果用作SUBSTRING 的工作原理。

DECLARE @c VARCHAR(100); SET @c = 'Email_Transport_Cabforce_NEB_Fallback_LB'

SELECT
@C Variable
,SUBSTRING(@c,CHARINDEX('_',@c,CHARINDEX('_',@c)+1)+1,(CHARINDEX('_',@c,CHARINDEX('_',@c,CHARINDEX('_',@c)+1)+1)-CHARINDEX('_',@c,CHARINDEX('_',@c)+1))-1) Result

输出

Variable                                    Result
Email_Transport_Cabforce_NEB_Fallback_LB    Cabforce

如果您的输出不能包含下划线,则使用这个;

DECLARE @c VARCHAR(100); SET @c = 'Email'
IF NOT EXISTS (SELECT 1 WHERE CHARINDEX('_',@c) < 2)
BEGIN
SELECT
@C Variable
,SUBSTRING(@c,CHARINDEX('_',@c,CHARINDEX('_',@c)+1)+1,(CHARINDEX('_',@c,CHARINDEX('_',@c,CHARINDEX('_',@c)+1)+1)-CHARINDEX('_',@c,CHARINDEX('_',@c)+1))-1) Result
END
ELSE
SELECT @c Result

输出

Result
Email

【讨论】:

  • italic_Many Thanx!_italic
  • 不客气。如果有任何答案解决了您的问题,请随时将其标记为已接受的答案。
  • 当 URL 字符串只包含一个单词,因此没有下划线时,这两种解决方案都有一些问题
  • @KarineGambarjan 我已经更新了我的答案以将其包装在一个 IF 中,该 IF 检查变量是否包含少于 2 个下划线
  • 感谢@Rich!它仅在声明一个值时起作用,我将它放在包含所有可能值的 DB 查询中,并且没有下划线,我收到错误“传递给 LEFT 或 SUBSTRING 函数的长度参数无效。”
【解决方案2】:

这显示了如何构建它:我已将其分解为多个部分;您可以看到逻辑并将其全部放回一个表达式中:

DECLARE @c varchar(100) SET @c = 'Email_Transport_Cabforce_NEB_Fallback_LB'

DECLARE @firstIndex int = CHARINDEX('_', @c) + 1
DECLARE @secondIndex int = CHARINDEX('_', @c, @firstIndex) + 1
DECLARE @thirdIndex int = CHARINDEX('_', @c, @secondIndex) + 1

SELECT SUBSTRING( @c, @secondIndex, @thirdIndex - @secondIndex - 1)

【讨论】:

  • 粗体非常感谢!
  • 当字符串完全不包含任何_,只有一个单词时它会崩溃......
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多