2015-04-22 15 views
0

我需要一个用MySQL编写的函数来添加数字在一起(正数和负数),这些数字位于单列中并由分隔符分隔。本例中的分隔符是“?”。该函数还需要忽略不是数字的无关字符,而不是减号(“ - ”),而不是句号(“。”),而不是分隔符(例如“?”)。以分隔符分隔的非1NF格式添加值的函数/过程

一个例子是一个名为“BalAdjAmt”一栏,其值可以是:

500.00?500.00?-1000.00 
500.00 
500.00?500.00 
500.00?500.00?-1000.00 B 

当此数据集运行应该是函数的结果:

0 
500.00 
1000.00 
0 

任何指针将是有益的。提前致谢。

+0

请显示你已经尝试过,SO不是免费的编码服务。 – Barmar

+0

“*任何指针都会有帮助*” - 标准化您的数据。关系数据库管理系统奇怪地被设计用来处理*关系数据;任何事情都会让你的生活变得困难。如果您无法更改模式以使其成为关系型,那么这强烈地表明您正在使用错误的工具进行工作。 – eggyal

+1

正常化您的数据。这是有人认为TNF不适合他们的应用或问题领域的典型例子。现在你有垃圾数据,你不能处理。 –

回答

0

您可以使用common_schema来协助工作。然后你可以创建一个这样的功能:

DELIMITER $$ 

DROP FUNCTION IF EXISTS `fn_test`$$ 

CREATE FUNCTION `fn_test`(`_value` VARCHAR(500)) 
RETURNS DECIMAL(7,2) 
BEGIN 
    DECLARE `_iteration`, `_num_tokens` INT UNSIGNED DEFAULT 0; 
    DECLARE `delim` CHAR(1) DEFAULT '?'; 
    DECLARE `_return` DECIMAL(7,2) DEFAULT 0; 

    SET `_num_tokens` := (SELECT `common_schema`.`get_num_tokens`(`_value`, `delim`)); 

    WHILE `_iteration` < `_num_tokens` DO 
     SET `_iteration` := `_iteration` + 1; 
     SET `_return` := `_return` + (SELECT CAST(`common_schema`.`split_token`(`_value`, `delim`, _iteration) AS DECIMAL(7,2))); 
    END WHILE;  

    RETURN `_return`; 
END$$ 

DELIMITER ;