特定位置的T-SQL子字符串

特定位置的T-SQL子字符串,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,我有下面的例子 DECLARE @String varchar(100) = 'GAME_20131011_Set - SET_20131012_Game' SELECT SUBSTRING(@String,0,CHARINDEX('_',@String)) SELECT SUBSTRING(@String,CHARINDEX('- ',@STRING),CHARINDEX('_',@STRING)) 我想得到单词“GAME”和“SET”(第一个单词前面的第一个单词来自“-”的两边) 我正在

我有下面的例子

DECLARE @String varchar(100) = 'GAME_20131011_Set - SET_20131012_Game'

SELECT SUBSTRING(@String,0,CHARINDEX('_',@String))
SELECT SUBSTRING(@String,CHARINDEX('- ',@STRING),CHARINDEX('_',@STRING))
我想得到单词“GAME”和“SET”(第一个单词前面的第一个单词来自“-”的两边)

我正在接受“游戏”,但在“设置”方面有问题

更新:“游戏”和“设置”只是例子,这些词可能会有所不同

DECLARE @String1 varchar(100) = 'GAMEE_20131011_Set - SET_20131012_Game' -- Looking for 'GAME' and 'SET'
DECLARE @String2 varchar(100) = 'GAMEE_20131011_Set - SETT_20131012_Game' -- Looking for 'GAMEE' and 'SETT'
DECLARE @String2 varchar(100) = 'GAMEEEEE_20131011_Set - SETTEEEEEEEE_20131012_Game' -- Looking for 'GAMEEEEE' and 'SETTEEEEEEEE'
试试这个

SELECT SUBSTRING(@String,0,CHARINDEX('_',@String))
SELECT SUBSTRING(@String,CHARINDEX('- ',@STRING)+1, CHARINDEX('_',@STRING)-1)
试试这个

SELECT SUBSTRING(@String,0,CHARINDEX('_',@String))
SELECT SUBSTRING(@String,CHARINDEX('- ',@STRING)+1, CHARINDEX('_',@STRING)-1)
试试这个

SELECT SUBSTRING(@String,0,CHARINDEX('_',@String))
SELECT SUBSTRING(@String,CHARINDEX('- ',@STRING)+1, CHARINDEX('_',@STRING)-1)
试试这个

SELECT SUBSTRING(@String,0,CHARINDEX('_',@String))
SELECT SUBSTRING(@String,CHARINDEX('- ',@STRING)+1, CHARINDEX('_',@STRING)-1)

charindex
接受可选的第三个参数,该参数表示从字符串中的哪个位置开始搜索。您可以将其合并到一个语句中,但使用三个语句更容易阅读

Declare @start int = charindex('-', @string) + 2;
Declare @end int = charindex('_', @string, @start);

Select substring(@string, @start, @end - @start);

charindex
接受可选的第三个参数,该参数表示从字符串中的哪个位置开始搜索。您可以将其合并为一个语句,但使用三个语句更容易阅读

Declare @start int = charindex('-', @string) + 2;
Declare @end int = charindex('_', @string, @start);

Select substring(@string, @start, @end - @start);

charindex
接受可选的第三个参数,该参数表示从字符串中的哪个位置开始搜索。您可以将其合并为一个语句,但使用三个语句更容易阅读

Declare @start int = charindex('-', @string) + 2;
Declare @end int = charindex('_', @string, @start);

Select substring(@string, @start, @end - @start);

charindex
接受可选的第三个参数,该参数表示从字符串中的哪个位置开始搜索。您可以将其合并为一个语句,但使用三个语句更容易阅读

Declare @start int = charindex('-', @string) + 2;
Declare @end int = charindex('_', @string, @start);

Select substring(@string, @start, @end - @start);

只要您的两个部分始终被分隔为一个特定字符(
-
,在您的示例中),您可以尝试拆分该值:

DECLARE @String varchar(100) = 'GAME_20131011_Set - SET_20131012_Game'

DECLARE @Left varchar(100), 
        @Right varchar(100)

-- split into two strings based on a delimeter
SELECT @Left = RTRIM(SUBSTRING(@String, 0, CHARINDEX('-',@String)))
SELECT @Right = LTRIM(SUBSTRING(@String, CHARINDEX('-',@String)+1, LEN(@String)))

-- handle the strings individually
SELECT SUBSTRING(@Left, 0, CHARINDEX('_', @Left))
SELECT SUBSTRING(@Right, 0, CHARINDEX('_', @Right))

-- Outputs: 
--    GAME
--    SET
下面是一个SQLFIDLE示例:

您在原始查询中遇到的问题是,您正在为开始索引指定
CHARINDEX('-',@String)
,该索引将在从该点开始的任何子字符串中包含
-
。此外,使用
CHARINDEX('.''',@String)
对于长度参数,您将始终以字符串中第一个
字符的索引结束


通过将原始字符串一分为二,可以避免这些问题。

只要您的两个部分始终是一个特定的字符(
-
,在您的示例中),就可以尝试对该值进行拆分:

DECLARE @String varchar(100) = 'GAME_20131011_Set - SET_20131012_Game'

DECLARE @Left varchar(100), 
        @Right varchar(100)

-- split into two strings based on a delimeter
SELECT @Left = RTRIM(SUBSTRING(@String, 0, CHARINDEX('-',@String)))
SELECT @Right = LTRIM(SUBSTRING(@String, CHARINDEX('-',@String)+1, LEN(@String)))

-- handle the strings individually
SELECT SUBSTRING(@Left, 0, CHARINDEX('_', @Left))
SELECT SUBSTRING(@Right, 0, CHARINDEX('_', @Right))

-- Outputs: 
--    GAME
--    SET
下面是一个SQLFIDLE示例:

您在原始查询中遇到的问题是,您正在为开始索引指定
CHARINDEX('-',@String)
,该索引将在从该点开始的任何子字符串中包含
-
。此外,使用
CHARINDEX('.''',@String)
对于长度参数,您将始终以字符串中第一个
字符的索引结束


通过将原始字符串一分为二,可以避免这些问题。

只要您的两个部分始终是一个特定的字符(
-
,在您的示例中),就可以尝试对该值进行拆分:

DECLARE @String varchar(100) = 'GAME_20131011_Set - SET_20131012_Game'

DECLARE @Left varchar(100), 
        @Right varchar(100)

-- split into two strings based on a delimeter
SELECT @Left = RTRIM(SUBSTRING(@String, 0, CHARINDEX('-',@String)))
SELECT @Right = LTRIM(SUBSTRING(@String, CHARINDEX('-',@String)+1, LEN(@String)))

-- handle the strings individually
SELECT SUBSTRING(@Left, 0, CHARINDEX('_', @Left))
SELECT SUBSTRING(@Right, 0, CHARINDEX('_', @Right))

-- Outputs: 
--    GAME
--    SET
下面是一个SQLFIDLE示例:

您在原始查询中遇到的问题是,您正在为开始索引指定
CHARINDEX('-',@String)
,该索引将在从该点开始的任何子字符串中包含
-
。此外,使用
CHARINDEX('.''',@String)
对于长度参数,您将始终以字符串中第一个
字符的索引结束


通过将原始字符串一分为二,可以避免这些问题。

只要您的两个部分始终是一个特定的字符(
-
,在您的示例中),就可以尝试对该值进行拆分:

DECLARE @String varchar(100) = 'GAME_20131011_Set - SET_20131012_Game'

DECLARE @Left varchar(100), 
        @Right varchar(100)

-- split into two strings based on a delimeter
SELECT @Left = RTRIM(SUBSTRING(@String, 0, CHARINDEX('-',@String)))
SELECT @Right = LTRIM(SUBSTRING(@String, CHARINDEX('-',@String)+1, LEN(@String)))

-- handle the strings individually
SELECT SUBSTRING(@Left, 0, CHARINDEX('_', @Left))
SELECT SUBSTRING(@Right, 0, CHARINDEX('_', @Right))

-- Outputs: 
--    GAME
--    SET
下面是一个SQLFIDLE示例:

您在原始查询中遇到的问题是,您正在为开始索引指定
CHARINDEX('-',@String)
,该索引将在从该点开始的任何子字符串中包含
-
。此外,使用
CHARINDEX('.''',@String)
对于长度参数,您将始终以字符串中第一个
字符的索引结束


通过将原始字符串一分为二,可以避免这些问题。

尝试运行
SELECT CHARINDEX('-',@string)
以查看它实际提供给您的索引并进行适当调整。尝试运行
SELECT CHARINDEX('-',@string)
查看它实际提供给您的索引并进行适当调整。尝试运行
选择CHARINDEX('-',@STRING)
查看它实际提供给您的索引并进行适当调整。尝试运行
选择CHARINDEX('-',@STRING)
查看它实际提供给您的索引并进行适当调整。
CHARINDEX(“”,@STRING)
将在
游戏
之后为您提供
的索引(即,这个:
游戏
)谢谢你的帖子。我试过了,但在名字不一样的时候遇到了问题。你知道如何使这个动态化吗?你不是在试图从第二个字符串“Set\u 20131012\u GAME”中提取游戏在第一个字符串“GAME\u 20131011\u Set”和第二个字符串“Set\u 20131012\u GAME”中的任何单词吗?我指的是代替游戏和在各自字符串中设置的任何单词吗(“”,@STRING)
将在
游戏
之后为您提供
的索引(即,这个:
游戏
)谢谢你的帖子。我试过了,但在名字不一样的时候遇到了问题。你知道如何使这个动态化吗?你不是在试图从第二个字符串“Set\u 20131012\u GAME”中提取游戏在第一个字符串“GAME\u 20131011\u Set”和第二个字符串“Set\u 20131012\u GAME”中的任何单词吗?我指的是代替游戏和在各自字符串中设置的任何单词吗(“”,@STRING)
将在
游戏
之后为您提供
的索引(即,这个:
游戏
)谢谢你的帖子。我试过了,但在名字不一样的时候遇到了问题。你知道如何使这个动态化吗?你不是在试图从第二个字符串“Set\u 20131012\u GAME”中提取游戏在第一个字符串“GAME\u 20131011\u Set”和第二个字符串“Set\u 20131012\u GAME”中的任何单词吗?我指的是代替游戏和在各自字符串中设置的任何单词吗(“”,@STRING)
将在
游戏
之后为您提供
的索引(即。,