我有以下示例。
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'
答案 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)
,您将始终以字符串中第一个 _
字符的索引结束。
通过将原始字符串拆分为两个,可以避免这些问题。