2014-09-05 92 views
0

使用以下字符串示例,我如何提取“加速”,“超速”,“制动”?可变长度TSQL子字符串

@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' 

正如您所看到的,报警状态可以是可变长度的。

我假设我需要SUBSTRING,CHARINDEX和可能的LEFT函数的组合,但我完全失去了功能。

例如,这适用于获取闹钟时间,但仅适用于闹钟时间为固定长度。

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

在此先感谢您。

+0

CharIndex可选择使用第二个参数告诉它从哪个字符开始搜索。你可以搜索','.. – Blorgbeard 2014-09-05 10:40:41

回答

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

“我怎样才能提取”加速“,”超速“,”制动“?很清楚,他不想要这些东西。 – Blorgbeard 2014-09-05 10:41:16

+0

@Blorgbeard我不清楚,但也许你是对的。 – jpw 2014-09-05 10:43:00

+0

谢谢jpw,替代我的不整齐尝试。 – 2014-09-05 10:56:59

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:', ''), ',', ''))) 

我不检查情况字符串不包含字符串[报警状态。这可以添加。解决方案2有一些假设:您一直在寻找'加速','超速'或'刹车';每个字符串只出现一次字 - 如果一个字符串具有“加速”,则不会有'超速'或'制动'; 在这种情况下,你可以使用类似:

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 
0

我已经设法想出这个不那么漂亮的解决方案。

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

任何改进它将不胜感激。

相关问题