0

我有以下示例。

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'(第一个'_'之前的第一个单词。

我收到“GAME”但遇到“SET”问题

更新:“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'
4

3 回答 3

1

试试这个

SELECT SUBSTRING(@String,0,CHARINDEX('_',@String))
SELECT SUBSTRING(@String,CHARINDEX('- ',@STRING)+1, CHARINDEX('_',@STRING)-1)
于 2013-10-11T19:59:28.820 回答
1

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

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

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

Example SQLFiddle

于 2013-10-11T19:59:28.863 回答
1

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

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

这是一个 SQLFiddle 示例:http ://sqlfiddle.com/#!3/d41d8/22594

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

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

于 2013-10-11T20:06:49.430 回答