現需求從上方測試數據的“備注”列中提取出金額
目前有兩個方法比較容易實現:
-
1、首先比較容易想到的就是利用函數stuff刪除掉所有的非數值字符。
STUFF ( character_expression , start , length ,character_expression )
利用函數stuff,將所有非數值字符全部刪除掉,自然就只剩下數值了。
首先需要定位到非數值的字符,用空字符替換掉這些字符,之后通過循環替換掉所有的非數值字符。
這里還需要函數patindex來定位字符串中的非數值字符。
PATINDEX ( '%pattern%' , expression )
自定義一個函數get_number如下:
1 IF OBJECT_ID('dbo.get_number') IS NOT NULL 2 DROP FUNCTION dbo.get_number; 3 GO 4 5 create function dbo.get_number(@S nvarchar(1000)) 6 returns int 7 as 8 begin 9 while PATINDEX('%[^0-9]%', @S) > 0 10 begin 11 set @S = STUFF(@S, PATINDEX('%[^0-9]%', @S), 1, '') 12 end 13 return @S 14 end 15 go 16 17 select dbo.get_number('花費3200元') as result 18 go
運行結果如下:
調用該自定義函數完成查詢,目標任務實現。
不過這里剛好數值都是整數,如果存在小數的情況,只需把自定義函數get_number中返回變量類型改為float,函數PATINDEX后匹配的字符中增加上“.”就可以了。
1 IF OBJECT_ID('dbo.get_number') IS NOT NULL 2 DROP FUNCTION dbo.get_number; 3 GO 4 5 create function dbo.get_number(@S nvarchar(1000)) 6 returns float 7 as 8 begin 9 while PATINDEX('%[^.0-9]%', @S) > 0 10 begin 11 set @S = STUFF(@S, PATINDEX('%[^.0-9]%', @S), 1, '') 12 end 13 return @S 14 end 15 go 16 17 select dbo.get_number('花費45.02元') as result 18 go
-
2、利用函數substring抽取出字符串中的數值
SUBSTRING ( expression , start , length)
根據substring的用法,需要定位出數值開始的位置與結束的位置,並計算出數值的長度。數值開始位置,利用PATINDEX來實現。結束位置的獲取,只需將字符串利用函數reverse進行翻轉,之后再使用PATINDEX來獲取。
1 IF OBJECT_ID('dbo.get_number') IS NOT NULL 2 DROP FUNCTION dbo.get_number; 3 GO 4 5 create function dbo.get_number(@S nvarchar(1000)) 6 returns int 7 as 8 begin 9 set @S = SUBSTRING(@S,PATINDEX('%[0-9]%', @S),len(@S)-PATINDEX('%[0-9]%', @S)-PATINDEX('%[0-9]%', reverse(@S))+2) 10 return @S 11 end 12 go 13 14 select dbo.get_number('花費1200元') as result 15 go