我有一个总是用这种格式的varchar:
'PB'+多个前导0 +数字+非数字字符。
例如:PB000013452S,PB000013452S3s2fss。
在这种情况下,如何解析varchar值以获得“数字”(13452)?
答案 0 :(得分:1)
使用PATINDEX
查找第一个数字的位置(不是0
),然后再次使用PATINDEX
查找第一个非数字字符的位置。然后使用SUBSTRING
提取数字:
SELECT SUBSTRING(V.YourString,PI.I,PATINDEX('%[^0-9]%',STUFF(V.YourString,1,PI.I-1,''))-1)
FROM (VALUES('PB000013452S'),('PB000013452S3s2fss'))V(YourString)
CROSS APPLY (VALUES(PATINDEX('%[1-9]%',V.YourString)))PI(I)
答案 1 :(得分:-1)
我为您的问题写了一个算法,您可以尝试一下,并且在它可以正常工作之前对其进行了测试,但是我将数字存储在表中,如果要连接它们,可以使用光标
declare @x varchar(30) = 'PB000013452S3s2fss' /*your string here*/
declare @_len int = len(@x) /*length of your string */
declare @array table (num varchar(30)) /*table for collecte number*/
declare @c int =1 /*counter*/
declare @_char varchar(1) /* to store one char from your string */
declare @result varchar(30)=''
while @_len>0
begin
set @_char = SUBSTRING(@x,@c,1)
if(@_char in ('1','2','3','4','5','6','7','8','9'))
begin
while @_len>0
begin
set @_char = SUBSTRING(@x,@c,1)
if(@_char in ('0','1','2','3','4','5','6','7','8','9'))
begin
insert into @array values (@_char)
set @c = @c+1
set @_len = @_len-1
end
else
set @_len = 0
end
end
set @c = @c+1
set @_len = @_len-1
end
select * from @array