Query to get only numbers from a string

前端 未结 14 2218
野性不改
野性不改 2020-11-22 06:17

I have data like this:

string 1: 003Preliminary Examination Plan   
string 2: Coordination005  
string 3: Balance1000sheet

The output I exp

14条回答
  •  南笙
    南笙 (楼主)
    2020-11-22 06:29

    T-SQL function to read all the integers from text and return the one at the indicated index, starting from left or right, also using a starting search term (optional):

    create or alter function dbo.udf_number_from_text(
        @text nvarchar(max),
        @search_term nvarchar(1000) = N'',
        @number_position tinyint = 1,
        @rtl bit = 0
    ) returns int
    as
        begin
            declare @result int = 0;
            declare @search_term_index int = 0;
    
            if @text is null or len(@text) = 0 goto exit_label;
            set @text = trim(@text);
            if len(@text) = len(@search_term) goto exit_label;
    
            if len(@search_term) > 0
                begin
                    set @search_term_index = charindex(@search_term, @text);
                    if @search_term_index = 0 goto exit_label;
                end;
    
            if @search_term_index > 0
                if @rtl = 0
                    set @text = trim(right(@text, len(@text) - @search_term_index - len(@search_term) + 1));
                else
                    set @text = trim(left(@text, @search_term_index - 1));
            if len(@text) = 0 goto exit_label;
    
            declare @patt_number nvarchar(10) = '%[0-9]%';
            declare @patt_not_number nvarchar(10) = '%[^0-9]%';
            declare @number_start int = 1;
            declare @number_end int;
            declare @found_numbers table (id int identity(1,1), val int);
    
            while @number_start > 0
            begin
                set @number_start = patindex(@patt_number, @text);
                if @number_start > 0
                    begin
                        if @number_start = len(@text)
                            begin
                                insert into @found_numbers(val)
                                select cast(substring(@text, @number_start, 1) as int);
    
                                break;
                            end;
                        else
                            begin
                                set @text = right(@text, len(@text) - @number_start + 1);
                                set @number_end = patindex(@patt_not_number, @text);
    
                                if @number_end = 0
                                    begin
                                        insert into @found_numbers(val)
                                        select cast(@text as int);
    
                                        break;
                                    end;
                                else
                                    begin
                                        insert into @found_numbers(val)
                                        select cast(left(@text, @number_end - 1) as int);
    
                                        if @number_end = len(@text)
                                            break;
                                        else
                                            begin
                                                set @text = trim(right(@text, len(@text) - @number_end));
                                                if len(@text) = 0 break;
                                            end;
                                    end;
                            end;
                    end;
            end;
    
            if @rtl = 0
                select @result = coalesce(a.val, 0)
                from (select row_number() over (order by m.id asc) as c_row, m.val
                        from @found_numbers as m) as a
                where a.c_row = @number_position;
            else
                select @result = coalesce(a.val, 0)
                from (select row_number() over (order by m.id desc) as c_row, m.val
                        from @found_numbers as m) as a
                where a.c_row = @number_position;
    
    
            exit_label:
                return @result;
        end;
    

    Example:

    select dbo.udf_number_from text(N'Text text 10 text, 25 term', N'term',2,1);
    

    returns 10;

提交回复
热议问题