2015-04-22 72 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 ;