Извлечение суммы в долларах из существующих данных sql? - PullRequest
1 голос
/ 24 ноября 2011

У меня есть поле, в котором содержатся описания и суммы в долларах.С помощью 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 Regex здесь представляется наиболее надежным, однако при попытке использовать функцию я получаю следующее сообщение об ошибке в SSMS:

SQL Server заблокировал доступ к процедуре 'sys.sp_OACreate' изкомпонент «Процедуры автоматизации Ole», так как этот компонент отключен как часть конфигурации безопасности для этого сервера.Системный администратор может разрешить использование «процедур автоматизации Ole» с помощью sp_configure.Для получения дополнительной информации о включении «Процедур автоматизации Ole» см. «Конфигурация контактной зоны» в электронной документации по SQL Server.

Я не хочу идти и изменять настройки сервера только для этой функции.У меня есть другая функция регулярных выражений, которая прекрасно работает без изменений.

Я не могу себе представить, что это так сложно - просто извлекать суммы в долларах.Есть более простые способы?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 25 ноября 2011
    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 голос
/ 24 ноября 2011

Эта ссылка должна помочь.

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

Предполагая, что вы в порядке с извлечением числовых значений, независимо от того, есть ли знак $ или нет. Если это строгое требование, понадобятся некоторые моды.

...