如何编写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))
)
答案 0 :(得分: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
答案 1 :(得分:0)
这显示了如何构建它:我把它分解成碎片;你可以看到逻辑并把它全部放回一个表达式中:
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)