我有一个要求,我需要解析列值以获取与之关联的工作请求编号。例如,列值可能包含 - "工作在AB-0012589" 或" AB-0012589已完成" 或其他包含工作请求编号。 (此处 AB-0012589 是工作申请编号)。
工作申请号的格式不会改变。它将采用 xx-xxxxxxx 格式,其中连字符前面的两个字符将是字母,后面的部分将是数字。如何使用正则表达式从列值解析工作请求编号?
因此,如果列值为" 已完成AC-0015587 "我想要的输出是 AC-0015587
提前致谢!
答案 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)
上面的使用给了我以下结果
希望这可以帮助你。
答案 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')