[SQL] 從文本中提取數值


現需求從上方測試數據的“備注”列中提取出金額

目前有兩個方法比較容易實現:

  • 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM