从字符串值中提取数字

时间:2019-12-06 18:36:30

标签: sql sql-server tsql parsing numbers

我有一个总是用这种格式的varchar:

'PB'+多个前导0 +数字+非数字字符。

例如:PB000013452S,PB000013452S3s2fss。

在这种情况下,如何解析varchar值以获得“数字”(13452)?

2 个答案:

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