zoukankan      html  css  js  c++  java
  • [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
  • 相关阅读:
    从零开始学ios开发(十三):Table Views(下)Grouped and Indexed Sections
    求助三陀工作室
    2015.6-2017.6软件测试学习计划
    标签管理
    Git的分支管理(三)
    Git的分支管理(二)
    Git的分支管理(一)
    Git的远程仓库
    Git版本的管理
    Git的版本管理创建和修改
  • 原文地址:https://www.cnblogs.com/geek-arking/p/9930524.html
Copyright © 2011-2022 走看看