某些地方的T-SQL SUBSTRING

时间:2013-10-11 19:47:40

标签: 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'这两个词的第一个单词' - '的第一个'_''。

我正在接受'游戏',但遇到了'SET'

的问题

更新:'游戏'和'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'

3 个答案:

答案 0 :(得分:1)

试试这个

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

答案 1 :(得分:1)

charindex采用可选的第三个参数,该参数指示字符串中的哪个poistion开始搜索。您可以将其转换为一个语句,但使用三个

更容易阅读
Declare @start int = charindex('-', @string) + 2;
Declare @end int = charindex('_', @string, @start);

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

<强> Example SQLFiddle

答案 2 :(得分: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),您将始终以字符串中第一个 _字符的索引结束。

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