从现有的sql数据中提取美元金额?

时间:2011-11-24 15:02:33

标签: regex tsql pattern-matching sql-server-2008-r2

我有一个字段,其中包含描述和金额的混合。使用TSQL,我想提取这些美元金额,然后将它们插入到记录的新字段中。

- 更新 -

一些数据样本可能是:

Used knife set for sale $200.00 or best offer.
$4,500 Persian rug for sale.
Today only, $100 rebate.
Five items for sale: $20 Motorola phone car charger, $150 PS2, $50.00 3 foot high shelf.

在上面的集合中,我想要抓住第一次出现的美元数字......这是最简单的。

我不是要从原始文本中删除金额,只是获取它们的值,然后将它们添加到新字段中。

金额可能/不能包含小数和逗号。

我确信PATINDEX不会削减它,我不需要一个极端的RegEx功能来实现这一目标。

但是,查看OLE正则表达式查找(执行)函数here似乎是最强大的,但是当尝试使用该函数时,我在SSMS中收到以下错误消息:

  

SQL Server阻止访问组件的过程'sys.sp_OACreate'   'Ole Automation Procedures'因为此组件已关闭   此服务器的安全配置的一部分。一个系统   管理员可以通过以下方式启用“Ole Automation Procedures”   使用sp_configure。有关启用'Ole。的更多信息   自动化过程',请参阅SQL Server中的“表面区域配置”   在线图书。

我不想仅为此功能更改我的服务器设置。我有另一个正则表达式函数,无需更改即可正常工作。

我无法想象这只是提取美元金额这么复杂。有更简单的方法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

    CREATE FUNCTION dbo.fnGetAmounts(@str nvarchar(max))
    RETURNS TABLE 
    AS
    RETURN 
    (
    -- generate all possible starting positions ( 1 to len(@str))
    WITH StartingPositions AS
    (
        SELECT 1 AS Position
        UNION ALL
        SELECT Position+1
        FROM StartingPositions
        WHERE Position <= LEN(@str)
    )
   -- generate possible lengths
    , Lengths AS
    (
        SELECT 1 AS [Length]
        UNION ALL
        SELECT [Length]+1
        FROM Lengths
        WHERE [Length] <= 15
    )
    -- a Cartesian product between StartingPositions and Lengths
    -- if the substring is numeric then get it
    ,PossibleCombinations AS 
    (

         SELECT CASE                
                WHEN ISNUMERIC(substring(@str,sp.Position,l.Length)) = 1 
                   THEN substring(@str,sp.Position,l.Length)         
                 ELSE null END as Number
                 ,sp.Position
                 ,l.Length
         FROM StartingPositions sp, Lengths l           
         WHERE sp.Position <= LEN(@str)            
    )
-- get only the numbers that start with Dollar Sign, 
-- group by starting position and take the maximum value 
-- (ie, from $, $2, $20, $200 etc)
    SELECT MAX(convert(money, Number)) as Amount
    FROM PossibleCombinations
    WHERE Number like '$%' 
    GROUP BY Position
    )

    GO

    declare @str nvarchar(max) = 'Used knife set for sale $200.00 or best offer.
    $4,500 Persian rug for sale.
    Today only, $100 rebate.
    Five items for sale: $20 Motorola phone car charger, $150 PS2, $50.00 3 foot high shelf.'

    SELECT *
    FROM dbo.fnGetAmounts(@str)
    OPTION(MAXRECURSION 32767) -- max recursion option is required in the select that uses this function

答案 1 :(得分:1)

此链接应该有所帮助。

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/extracting-numbers-with-sql-server

假设您可以提取数字,无论是否有$符号。如果这是严格的要求,则需要一些mod。