如何获取与SQL Server中的正则表达式匹配的字符串的一部分

时间:2016-11-22 11:16:00

标签: sql-server regex

我有一个要求,我需要解析列值以获取与之关联的工作请求编号。例如,列值可能包含 - "工作在AB-0012589" " AB-0012589已完成" 或其他包含工作请求编号。 (此处 AB-0012589 是工作申请编号)。

工作申请号的格式不会改变。它将采用 xx-xxxxxxx 格式,其中连字符前面的两个字符将是字母,后面的部分将是数字。如何使用正则表达式从列值解析工作请求编号?

因此,如果列值为" 已完成AC-0015587 "我想要的输出是 AC-0015587

提前致谢!

5 个答案:

答案 0 :(得分:3)

这有效:

declare @Value nvarchar(4000)
set @Value='Worked a-232 on AB-0012589'

select substring(@Value,
patindex('%[A-Z][A-Z][-][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%',@Value),10)

将@Value替换为您的列

输出: AB-0012589

答案 1 :(得分:1)

 select substring('Completed AC-0015587',(CHARINDEX('-','Completed AC-0015587')-2), 10)

输出中     AC-0015587

答案 2 :(得分:1)

您可以尝试使用以下表达式

substring(t1.column_value,(CHARINDEX('-',t1.column_value)-2), 10)

上面的使用给了我以下结果

enter image description here

希望这可以帮助你。

答案 3 :(得分:1)

使用patindex并找到' - '我们可以获取工作申请号

的位置
select substring('Completed AC-0015587',
          patindex('%-%','Completed AC-0015587')-2,len('Completed AC-0015587'))

更新:更改下面的patindex可能会对您有所帮助

select substring('Worked on- AV-0217585',
patindex('%-[0-9]%','Worked on- AV-0217585')-2,len('Worked on- AV-0217585'))  

答案 4 :(得分:1)

Create function ReturnPart (@val as varchar(100))
 Returns varchar(10)
 as
 begin
 declare @length as int 
 declare @loop as int
 declare @ret as varchar(10)
 set @loop =1
 set @length = len(@val)

 while @loop<=@length-9
    begin
    if exists(select 1 where substring(@val,@loop,10) like '[a-z][a-z][-][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
        set @ret = substring(@val,@loop,10)
    set @loop=@loop+1
    end
Return @ret
end



select dbo.ReturnPart('Worked on AB-0012589')
select dbo.ReturnPart('AB-0012589 is completed')