2017-03-07 56 views
1

我正在從一個字符串中提取特定數據元素的小型項目。字符串示例:字符串變化時使用子字符串和Charindex的SQL Server

ABC:123-456-789-1234 description end 1/1/2015 

我試圖提取的部分是123-456-789-1234。現在我有以下SQL來選擇該數據元素:

SELECT substring(data, charindex('ABC',data)+4,16) FROM Table X 

問題是該字符串變化很大。例如,下面是如何也可能提供的字符串:

ABC: 123-456-789-1234 description end 1/1/2015 
ABC: 123-456-789-1234 da1234 
ABC: 123-456-789-1234 random1234-12 1/1/2015 
ABC: 123-456-789-1234,-ing end 1/1/2015 
ABC 123-456-789-1234 description end 

有捕捉我想要的確切數據元素的更好的辦法?我無法將一個值硬編碼到子字符串中。

編輯:應該澄清,該字符串不是在所有情況下相同(即文字說明或日期是可選的)

編輯:找到了答案。需要替換所有內容並提取相關信息。

SELECT substring(replace(replace(replace(data,' ',''),'-',''),':',''), charindex('ABC',replace(replace(replace(data,' ',''),'-',''),':',''))+3,13) 
+0

我不擅長白衣,但也許使用正則表達式 – McNets

回答

0

這工作,但我不知道這是否是你正在尋找:

一下:http://rextester.com/VSRU64720

declare @txt table (data varchar(300)); 
insert into @txt values 
('f df df d ABC: 123-456-789-1234 description end 1/1/2015'), 
('adf d fdf d ABC: 123-456-789-1234 description end 1/1/2015'), 
('adf ad fdas d ABC 123-456-789-1234 description end 1/1/2015'); 

with ctMsg as 
(
    select substring(data, charindex('ABC',data), len(data) - charindex('ABC',data) + 1) as msg 
    from @txt 
) 
select substring(msg, patindex('%[0-9]%', msg), 16) 
from ctMsg; 

它返回:

123-456-789-1234 
123-456-789-1234 
123-456-789-1234 
0

使用patindex而不是charindex找到出現在字符串中的第一個號碼,並從這個數字繩剪斷的地方,描述字(含空格)開始:

SELECT substring(data, patindex('%[0-9]%', data), patindex('% description%', data) - patindex('%[0-9]%', data)) FROM Table X 

您的數據值更新後:

select substring(a.data, 1, patindex('%[^0-9-]%', a.data)-1) from ( SELECT substring(data, patindex('%[0-9]%', data), len(data)) as data FROM Table X ) a

+0

應該澄清的說明文字也各不相同。請參閱我的更新值 – Help123

+0

剛編輯我的答案。 – Miyazawa

0

編輯:更新了新的數據

declare @YourTable table (data varchar(300)); 
insert into @YourTable values 
('ABC: 123-456-789-1234 description end 1/1/2015'), 
('ABC: 123-456-789-1234 da1234'), 
('ABC: 123-456-789-1234 random1234-12 1/1/2015'), 
('ABC: 123-456-789-1234,-ing end 1/1/2015'), 
('ABC 123-456-789-1234 description end') 

Select stuff(left(data,patindex('%-[0-9][0-9][0-9][0-9]%',data)+4),1,patindex('%[0-9]%',data)-1,'') 
From @YourTable 

返回

(No column name) 
123-456-789-1234 
123-456-789-1234 
123-456-789-1234 
123-456-789-1234 
123-456-789-1234