SQL принимает только числовые значения из varchar

скажем, у меня есть несколько полей, таких как следующие:

abd738927
jaksm234234
hfk342
ndma0834
jon99322

тип: тип varchar.

Как мне взять только числовые значения из этого для отображения:

738927
234234
342
0834
99322

попробовали подстроку, однако данные варьируются по длине, и cast не работал либо из-за неспособности конвертировать, какие-либо идеи?

8 ответов


вот пример с PATINDEX:

select SUBSTRING(fieldName, PATINDEX('%[0-9]%', fieldName), LEN(fieldName))

это предполагает, что (1) поле будет иметь числовое значение, (2) все цифры сгруппированы вместе, и (3) цифры не имеют никаких последующих символов после них.


Ну, если вы не хотите создать функцию, вы можете просто что-то вроде этого:

cast(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
replace(replace(replace(replace(replace(replace(replace(replace(replace(YOUR_COLUMN
,'A',''),'B',''),'C',''),'D',''),'E',''),'F',''),'G',''),'H',''),'I',''),'J','')
,'K',''),'L',''),'M',''),'N',''),'O',''),'P',''),'Q',''),'R',''),'S',''),'T','')
,'U',''),'V',''),'W',''),'X',''),'Y',''),'Z',''),'$',''),',',''),' ','') as float) 

Я думаю, вы хотите VBA


DECLARE @NonNumeric varchar(1000) = 'RGI000Testing1000'
DECLARE @Index int  
SET @Index = 0  
while 1=1  
begin  
    set @Index = patindex('%[^0-9]%',@NonNumeric)  
    if @Index <> 0  
    begin  
        SET @NonNumeric = replace(@NonNumeric,substring(@NonNumeric,@Index, 1), '')  
    end  
    else    
        break;   
end     
select @NonNumeric -- 0001000

извлечь только цифры (без использования цикла while) и проверить каждый символ, чтобы увидеть, если это число и извлечь его

   Declare @s varchar(100),@result varchar(100)
    set @s='as4khd0939sdf78' 
    set @result=''

    select
        @result=@result+
                case when number like '[0-9]' then number else '' end from 
        (
             select substring(@s,number,1) as number from 
            (
                select number from master..spt_values 
                where type='p' and number between 1 and len(@s)
            ) as t
        ) as t 
    select @result as only_numbers 

входной таблице

если у вас есть данные, как указано выше в изображении, используйте следующий запрос

select field_3 from table where PATINDEX('%[ ~`!@#$%^&*_()=+\|{};",<>/?a-z]%', field_3)=0

результаты будут выглядеть так

результат в таблице


select substring(
                'jaksm234234',
                patindex('%[0-9]%','jaksm234234'),
                LEN('jaksm234234')-patindex('%[0-9]%','jaksm234234')+2
                )

извлекать только числа из строки. Возвращает строку со всеми числами внутри. Пример: this1is2one345long6789number вернет 123456789

CREATE FUNCTION [dbo].[GetOnlyNumbers] (@Temp VARCHAR(1000))

RETURNS VARCHAR (1000) AS BEGIN

    DECLARE @KeepValues AS VARCHAR(50)
    SET @KeepValues = '%[^0-9]%'
    WHILE PATINDEX(@KeepValues, @Temp) > 0
        SET @Temp = STUFF(@Temp, PATINDEX(@KeepValues, @Temp), 1, '')

    RETURN @Temp
END