2017-03-05 5 views
1

mySQLデータベースのデータセットでは、すべての値がvarcharとして保存され、ユーロの表示量は「EUR 2.5E + 2」、「EUR 56.95」、 1E + 2 'mysqlのVarcharからDecimalへの科学記法のキャスト

ここでもう一度参考にして、これを10進数に変換して後で計算する方法を考え出すことはできません。

私はこの質問への提案された解決策に従うことを試してみました: Casting Scientific Notation (from varchar -> numeric) in a view

しかし、私は私の問題に適合させるあまり、クエリ、ビュー、またはストアドプロシージャのような溶液を複製することができませんでした。

誰かが私を助けてくれることを願っています。 ありがとうございます!

+1

理想的には、「varchar」であってはなりません。ただし、 'EUR'なしで変換しようとするとチャンスがあり、必要に応じてそれを再び連結することができます。 –

+0

どうやってこの混乱に巻き込まれましたか?とにかく、「EUR」を取り除くと(そしておそらく0を加えて)それを修正する必要があります – Strawberry

+0

ええ、まあ...私がしようとしている分析の種類は、システムが構築されたときに優先順位が低くなりました。 :-B – zuckerbrot

答えて

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

-> 

250 

注意:このは1つのスペースがあるを前提とし、数値が空白の後です。

+0

これはかなりうまく見える、ありがとう!しかし、減算には驚くべき結果があります。このコードが92.06に戻り、100を引くと、-7.939999999999998になります。 – zuckerbrot

+0

これは、一般的な問題です、 'FLOAT'と' DOUBLE'です。このようなフィールドは、いくつかの重要なビット数に正確ですが、小数点に変換すると、そのようなことが起こります。 –

1

非常にリックジェームズありがとう、あなたのソリューションはかなりうまくいきます。 はしかし、私は明示的に小数点としてストリングをキャストすることを好む:

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

今、私は結果の計算を実行することができます(リックの答えの下のコメントを参照します)。

+1

_money_の丸め誤差を避けるには、 'DECIMAL'を使用してください(しかし' '' '' '' '' '' '' '' '' '' '' '' 5 '; make確かにそれは十分に大きいです。) –