TSQL子串的可变长度

时间:2014-09-05 10:19:01

标签: tsql sql-server-2008-r2

使用以下字符串示例,我如何提取"加速","超速","制动"?

@String = 'Alarm Time: 28/08/2014 08:45:50  Alarm Status: Acceleration, Accepted by joe.bloggs' 
@String = 'Alarm Time: 28/08/2014 08:47:25  Alarm Status: Speeding, Accepted by jane.doe'
@String = 'Alarm Time: 28/08/2014 08:50:14  Alarm Status: Braking, Accepted by john.doe'

如您所见,警报状态可以是可变长度。

我假设我需要SUBSTRINGCHARINDEX和可能LEFT功能的组合,但我完全迷失了。

例如,这适用于获取警报时间,但仅限于警报时间具有固定长度。

RIGHT(SUBSTRING(@String,CHARINDEX('Alarm Time: ', @String),31),19)

提前谢谢。

3 个答案:

答案 0 :(得分:2)

如果您想要Alarm status:之后的所有内容,那么这应该可行:

select substring(@String, charindex('Status: ', @string, 0)+8, len(@string))

如果您只想要关键字("加速","超速","制动"):

select substring(@String, charindex('Status: ', @string, 0)+8, charindex(',',substring(@String, charindex('Status: ', @string, 0)+8, len(@string)),0)-1)
上述两个版本的

Sample SQL Fiddle

修改:仅针对关键字(fiddle for this

的较短版本
SELECT 
SUBSTRING(
    @String,    -- string to be searched
    (CHARINDEX('s:', @String) + 2), -- start position
    CHARINDEX(',', @String) - (CHARINDEX('s:', @String) + 2) -- length 
    )

答案 1 :(得分:0)

我非常难看的解决方案:

declare @String as varchar(100) = 'Alarm Time: 28/08/2014 08:45:50  Alarm Status:   Acceleration, Accepted by joe.bloggs' 

select @string
,
ltrim(rtrim(
replace
(
replace
(
substring
(
substring(@string, patindex('%Alarm Status:%,%', @string), len(@string))
,1
,patindex('%,%', substring(@string, patindex('%Alarm Status:%,%', @string),    len(@string))))
, 'Alarm Status:', ''), ',', '')))

我没有检查字符串不包含字符串[Alarm Status]的情况。这可以添加。

解决方案2做了一些假设:你总是在寻找加速'加速'加速'或者'制动&#39 ;;这些单词每个字符串只出现一次 - 如果一个字符串有'加速'它不会有超速'或者'制动&#39 ;; 在这种情况下,您可以使用以下内容:

declare @String as varchar(100) 
set @String = 'Alarm Time: 28/08/2014 08:45:50  Alarm Status: Acceleration, Accepted by joe.bloggs' 

select case 
    when charindex('Acceleration', @string) > 0 then 'Acceleration'
    when charindex('Speeding', @string) > 0 then 'Speeding'
    when charindex('Braking', @string) > 0 then 'Braking'
    else null
end

答案 2 :(得分:0)

我设法提出了这个不那么整洁的解决方案。

SELECT SUBSTRING(@String, ( CHARINDEX('Alarm Status: ', @String) + LEN('Alarm Status: ') ), CHARINDEX(', Accepted by ', @String) - (CHARINDEX('Alarm Status: ', @String) + LEN('Alarm Status: ')))

对它的任何改进都将不胜感激。