如何使用CHARINDEX和SUBSTRING在第二个和第三个“_”之间提取特定文本?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用CHARINDEX和SUBSTRING在第二个和第三个“_”之间提取特定文本?相关的知识,希望对你有一定的参考价值。

如何编写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))
)
答案

这显示了如何构建它:我把它分解成碎片;你可以看到逻辑并把它全部放回一个表达式中:

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)
另一答案

这有点长,但你可以这样做。它找到第一个下划线的位置,然后将其用作下一个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

以上是关于如何使用CHARINDEX和SUBSTRING在第二个和第三个“_”之间提取特定文本?的主要内容,如果未能解决你的问题,请参考以下文章

sql STRING操作,SUBSTRING,CHARINDEX,REPLACE,CONCAT,LEFT,RIGHT,UPPER,LOWER

SqlServer中Substring函数的用法

SQLServer函数 left()charindex()stuff()的使用

sql语句,能够截取指定字段后面的一个字符串吗?

SQL实用技巧:如何分割字符串

sql 字符串操作以及其他(转)