我正在开发一个小项目来从字符串中提取特定数据元素。字符串的一个例子:
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 :(得分: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
答案 1 :(得分:0)
使用 patindex 代替 charindex 查找字符串中出现的第一个数字,并将此数字中的字符串剪切到 description 单词(带空格字符)开始:
@ContextConfiguration(loader = AnnotationConfigContextLoader.class)
更新数据值后:
SELECT substring(data, patindex('%[0-9]%', data), patindex('% description%', data) - patindex('%[0-9]%', data)) FROM Table X
答案 2 :(得分: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