16

假设我有如下几个字段:

abd738927
jaksm234234
hfk342
ndma0834
jon99322

类型:varchar。

如何仅从中获取数值来显示:

738927
234234
342
0834
99322

尝试过子字符串,但是数据的长度不同,并且由于无法转换,演员也不起作用,有什么想法吗?

4

9 回答 9

24

这是 PATINDEX 的示例:

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

这假设 (1) 字段将有一个数字,(2) 数字全部组合在一起,并且 (3) 数字后面没有任何后续字符。

于 2012-07-04T17:11:33.133 回答
6

仅提取数字(不使用 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 
于 2012-07-04T18:06:37.967 回答
4
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
于 2012-07-04T17:13:49.247 回答
2

我认为你想要 VBA 的Val()功能。很容易完成IsNumeric()

create function Val 
(
    @text nvarchar(40)
) 
returns float
as begin
    -- emulate vba's val() function
    declare @result float 
    declare @tmp varchar(40)

    set @tmp = @text
    while isnumeric(@tmp) = 0 and len(@tmp)>0 begin
        set @tmp=left(@tmp,len(@tmp)-1)
    end
    set @result = cast(@tmp as float)

    return @result
end
于 2012-07-04T17:09:50.983 回答
2

好吧,如果您不想创建函数,则可以这样:

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) 
于 2016-04-07T18:52:17.177 回答
2

输入表

如果您在图像中有上述数据,请使用以下查询

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

结果将如下所示

结果表

于 2016-12-20T12:13:16.490 回答
1
select substring(
                'jaksm234234',
                patindex('%[0-9]%','jaksm234234'),
                LEN('jaksm234234')-patindex('%[0-9]%','jaksm234234')+2
                )
于 2012-07-05T11:03:29.607 回答
1

仅从字符串中提取数字。返回一个包含所有数字的字符串。示例: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
于 2018-03-17T14:47:49.980 回答
0

具有 patindex 的反向字符串的权利也适用于那些

SELECT [Column], 
  CAST(RIGHT([Column], PATINDEX('%[0-9][^0-9]%', REVERSE([Column])+' ')) AS INT) as [Num]
FROM (VALUES 
('abd738927'),
('jaksm234234'),
('hfk342'),
('ndma0834'),
('jon99322'),
) val([Column])
柱子 编号
abd738927 738927
jaksm234234 234234
HFK342 342
ndma0834 834
乔恩99322 99322
于 2021-12-10T04:16:21.230 回答