2014-09-05 108 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: '))) 

任何改進它將不勝感激。