2017-03-05 27 views
1

爲十進制在一個MySQL數據庫,在數據集中的所有值都存儲爲varchar,歐元的節目量,並期待這樣的:「EUR 2.5E + 2」,「EUR 56.95」,' EUR 1E + 2'從varchar鑄造科學記數法在MySQL

現在,我想再次變得有用,並轉換成十進制爲進一步計算這一點,但無法弄清楚如何做到這一點。

我曾試圖按照建議的解決了這個問題: Casting Scientific Notation (from varchar -> numeric) in a view

但是,我未能複製解決方案查詢,視圖或存儲過程,更使其適應我的問題。

我真的希望有人能幫助我在這裏。 在此先感謝!

+1

理想的情況下它不應該是一個'varchar'。但是,你可能會想不'EUR'轉換,然後,如果需要的話,再次相連來有機會。 –

+0

你是如何設法陷入混亂的?無論如何,刪除「歐元」(也許加0)應該修復它 – Strawberry

+0

是的,那麼......我試圖做的那種分析具有低優先級,當系統建立時.Devs說他們會改變它,雖然:-B – zuckerbrot

回答

1
SELECT SUBSTRING_INDEX('EUR 2.5E+2', ' ', -1) + 0; 

-> 

250 

注意:此假設有一個空間,而數值是空間之後。

+0

看起來不錯,謝謝!但是,減法有令人驚訝的結果。說,當這個代碼重新運行92.06,我減去100,我得到-7.939999999999998. – zuckerbrot

+0

這是'FLOAT'和'DOUBLE'的一般問題。這些字段對於某些重要位是精確的;但是當轉換爲十進制時,就會發生類似的情況。您的特定示例獲得了3-4位精度;然後轉換將噪聲引入。有許多關於浮點問題的討論。如果您存儲美元/歐元和美分,請使用DECIMAL來避免這種情況,當然這就是您的答案 –

1

非常感謝里克·詹姆斯,您的解決方案工作得很好。 不過,我寧願顯式轉換子爲十進制:

CAST(SUBSTRING_INDEX(p.amount, ' ', -1) AS DECIMAL(5,2)) 

現在我可以對結果計算(見下文裏克的回答評論)。

+1

爲避免_money_出現舍入誤差,請使用DECIMAL(但請注意「 5'; make確定它足夠大。) –