当字符串变化时,SQL Server使用Substring和Charindex

时间:2017-03-07 23:18:00

标签: sql sql-server string tsql

我正在开发一个小项目来从字符串中提取特定数据元素。字符串的一个例子:

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)

3 个答案:

答案 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