次のようなフィールドがいくつかあるとします。
abd738927
jaksm234234
hfk342
ndma0834
jon99322
タイプ: varchar.
これから数値だけを取得して表示するにはどうすればよいですか。
738927
234234
342
0834
99322
部分文字列を試しましたが、データの長さが異なり、変換できないためにキャストが機能しませんでした。アイデアはありますか?
次のようなフィールドがいくつかあるとします。
abd738927
jaksm234234
hfk342
ndma0834
jon99322
タイプ: varchar.
これから数値だけを取得して表示するにはどうすればよいですか。
738927
234234
342
0834
99322
部分文字列を試しましたが、データの長さが異なり、変換できないためにキャストが機能しませんでした。アイデアはありますか?
PATINDEX を使用した例を次に示します。
select SUBSTRING(fieldName, PATINDEX('%[0-9]%', fieldName), LEN(fieldName))
これは、(1) フィールドに数値が含まれていること、(2) 数値がすべてグループ化されていること、(3) 数値の後に後続の文字がないことを前提としています。
数字のみを抽出し(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
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
関数を作成したくない場合は、次のようにすることができます。
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)
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
select substring(
'jaksm234234',
patindex('%[0-9]%','jaksm234234'),
LEN('jaksm234234')-patindex('%[0-9]%','jaksm234234')+2
)
逆文字列の 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 |