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

関数を作成したくない場合は、次のようにすることができます。

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

Val()VBAの機能が欲しいと思います。で達成するのに十分簡単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 に答える
1
select substring(
                'jaksm234234',
                patindex('%[0-9]%','jaksm234234'),
                LEN('jaksm234234')-patindex('%[0-9]%','jaksm234234')+2
                )
于 2012-07-05T11:03:29.607 に答える
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 に答える