• [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
  • 相关阅读:
    Vue2.5
    Vue --- :is
    Vue面试中经常会被问到的面试题
    100道JS构造函数面试题
    100道前端面试题
    占位
    06-验证码-基本功能实现
    由ES规范学JavaScript(二):深入理解“连等赋值”问题
    JS中keyup, keypress, keydown以及oninput四个事件的区别
    Java中class的声明
  • 原文地址:https://www.cnblogs.com/geek-arking/p/9930524.html
Copyright © 2020-2023  润新知