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

Sql server 如何获取SQL Server中与正则表达式匹配的字符串部分,sql-server,regex,Sql Server,Regex,我有一个需求,我需要解析一个列值,以获得与之关联的工作请求号。例如,列值可能包含-“在AB-0012589上工作”或“AB-0012589已完成”或任何包含工作请求编号的内容。(此处AB-0012589是工作请求编号) 工作申请编号的格式不会更改。它将采用xx-xxxxxxx格式,其中连字符前面的两个字符为字母,后面的部分为数字。如何使用正则表达式从列值解析工作请求号 因此,如果列值为“已完成AC-0015587”,则我所需的输出为AC-0015587 提前谢谢 select substrin

我有一个需求,我需要解析一个列值,以获得与之关联的工作请求号。例如,列值可能包含-“在AB-0012589上工作”“AB-0012589已完成”或任何包含工作请求编号的内容。(此处AB-0012589是工作请求编号)

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

因此,如果列值为“已完成AC-0015587”,则我所需的输出为AC-0015587

提前谢谢

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

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

子字符串(t1.列u值,(CHARINDEX('-',t1.列u值)-2),10)

使用上面给出的结果如下


希望这对您有所帮助。

使用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'))  
这项工作:

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

创建函数ReturnPart(@val作为varchar(100))
返回varchar(10)
作为
开始
将@length声明为int
将@loop声明为int
将@ret声明为varchar(10)
设置@loop=1
设置@length=len(@val)

虽然@loop,但工作请求不会每次都相同。它可能会改变,但格式将是相同的。这就是我寻找正则表达式解决方案的原因。是的,它会起作用。您可以仅使用此格式的列名xx-xxxxxxx进行检查。@SubhaI不想从这里分离字母和数字。我的问题是,如果我有一个列,它的值类似于“在AV-0217585上工作”,我如何从那里解析并获得值“AV-0217585”?看,我不能硬编码这个号码。这将会改变。格式将是相同的。我希望这是有道理的。你现在能检查一下吗?这是你所期望的。@subbathank你的答案。是的,我希望这样,但如果列值中有任何其他连字符,它将不起作用。是否有任何方法可以匹配精确的XX-XXXXXXX格式?从列值中,我想获得与XX-XXXXXXX模式匹配的零件。如我的问题中给出的示例所述。请查看我编辑的答案:谢谢您的回答,但如果列值中有任何其他连字符,则该选项将不起作用。是否有任何方法可以匹配精确的XX-XXXXXXX格式?谢谢您的回答,但如果列值中有任何其他连字符,则无法匹配。有什么方法可以匹配精确的XX-XXXXXXX格式吗?@Subha现在更新了帖子检查。只需将
替换为您的列,并将
(选择'Worked on AB-0012589'作为值)作为MyTable
替换为您的表名谢谢您的回答,但如果列值中有任何其他连字符,它将不起作用。有什么方法可以匹配XX-XXXXXX格式吗?非常感谢Nina!修好了。将
len(@Value)
替换为10Works太棒了!感谢@cloudsafe,并祝贺您的早期积分:)
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')