从文本字段中提取数字

时间:2016-05-04 10:09:25

标签: sql-server-2008 tsql text numeric

有一个包含类似于以下字段的表

856655.460000000000000+0.000000000000000+2200121.020000000000000 164171.720000000000000+0.000000000000000+421637.020000000000000 0.000000000000000+0.000000000000000+0.000000000000000+0.000000000000000 103176.220000000000000+0.000000000000000+264984.210000000000000

我需要做的是提取数字字段并将它们合计。列中可能有不同数量的数字字段,但它们都将用“+”符号分隔 任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

试试这个。要获得更好的答案,您应该添加有关表格结构的更多详细信息。

DECLARE @val VARCHAR(MAX) = '856655.460000000000000+0.000000000000000+2200121.020000000000000+164171.720000000000000+0.000000000000000+421637.020000000000000+0.000000000000000+0.000000000000000+0.000000000000000+0.000000000000000+103176.220000000000000+0.000000000000000+264984.210000000000000';
DECLARE @newVal VARCHAR(MAX);

CREATE TABLE #Table
(
           value DECIMAL(30, 15)
);

WHILE LEN(@val) > 0
    BEGIN
       IF(@val LIKE '%+%')
          BEGIN
             SET @newVal = LEFT(@val, CHARINDEX('+', @val));
             INSERT INTO #table 
                VALUES
                (
                    CONVERT( DECIMAL(30, 15), LEFT(@newVal, LEN(@newVal) - 1))
                );
             SET @val = SUBSTRING(@val, LEN(@newVal)+1, LEN(@Val)-LEN(@newVal));
          END;
       ELSE
          BEGIN
             INSERT INTO #Table
                VALUES 
                (
                    CONVERT( DECIMAL(30, 15), REPLACE(@val, '+', ''))
                );
             SET @val = '';
          END;
    END;

SELECT * FROM #Table
SELECT sum(value) FROM #Table;
DROP TABLE #Table

修改

要改进这个以在表上工作,您可以添加一个cursor循环遍历表中的每一行,运行上面的查询并使用总和的结果更新表。我确信有更好的方法,但如果这是一次清理,它应该工作。干杯

答案 1 :(得分:0)

显然,你必须修改它以适合你的情况,但基本的概念是将加号分隔的字符串转换为xml,然后使用nodes方法将其分开。

IF OBJECT_ID('tempdb..#temp', 'U') IS NOT NULL DROP TABLE #temp;

declare @string varchar(250)
declare @xml xml

set @string = '856655.460000000000000+0.000000000000000+2200121.020000000000000'

set @xml = ('<r>' + REPLACE(@string,'+','</r><r>') + '</r>')

select  t.v.value('r[1]', 'decimal(25,15)') as Value1, 
        t.v.value('r[2]', 'decimal(25,15)') as Value2,
        t.v.value('r[3]', 'decimal(25,15)') as Value3,
        t.v.value('r[4]', 'decimal(25,15)') as Value4
into #temp
from @xml.nodes('/') AS t(v)

select * 
from #temp

select coalesce(Value1, 0) + coalesce(Value2, 0) + 
coalesce(Value3, 0) + coalesce(Value4, 0) as 'Total'
from #temp

您必须向查询中添加更多代码,以便为字符串中的每个潜在值选择#temp。如果您有大量可能的数字,这可能无法扩展。

希望这可以帮助您达到您的需求。