【问题标题】:Casting Scientific notation from Varchar to Decimal in mysql在mysql中将科学记数法从Varchar转换为Decimal
【发布时间】:2017-03-05 22:54:50
【问题描述】:

在 mySQL 数据库中,数据集中的所有值都存储为 varchar,显示欧元金额,如下所示:'EUR 2.5E+2'、'EUR 56.95'、'EUR 1E+2'

现在,我想让它再次有用并将其转换为十进制以进行进一步计算,但不知道该怎么做。

我已尝试按照建议的解决方案来解决此问题: Casting Scientific Notation (from varchar -> numeric) in a view

但是,我未能将解决方案复制为查询、视图或存储过程,更不用说使其适应我的问题了。

我真的希望有人可以在这里帮助我。 提前致谢!

【问题讨论】:

  • 理想情况下它不应该是varchar。但是,您可能有机会尝试在不使用 EUR 的情况下进行转换,然后在需要时再次将其连接回来。
  • 你是如何进入这个烂摊子的?无论如何,删除“欧元”(也许添加 0)应该可以解决它
  • 是的,嗯......当系统构建时,我尝试做的那种分析的优先级很低。开发人员说他们会改变它,不过:-B

标签: mysql string casting decimal


【解决方案1】:

非常感谢 Rick James,您的解决方案运行良好。 但是,我更喜欢将子字符串显式转换为十进制:

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

现在我可以对结果进行计算(请参阅 Rick 答案下方的评论)。

【讨论】:

  • 为避免 money 的舍入错误,请使用DECIMAL。 (但请注意5;确保它足够大。)
【解决方案2】:
SELECT SUBSTRING_INDEX('EUR 2.5E+2', ' ', -1) + 0;

->

250

注意:这里假设有一个空格,数值在空格后面。

【讨论】:

  • 看起来不错,谢谢!然而,减法有令人惊讶的结果。比如说,当这段代码返回 92.06 并减去 100 时,我得到 -7.939999999999998。
  • 这是FLOATDOUBLE 的一般问题。这些字段精确到一些有效位;但是当转换为十进制时,就会发生类似的事情。您的特定示例获得了 3-4 位的精度;然后转换引入了噪音。有很多关于浮点问题的讨论。如果您要存储美元/欧元和美分,请使用DECIMAL 来避免这种情况。当然,这就是你的答案。
猜你喜欢
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 2014-09-25
  • 2021-12-23
  • 1970-01-01
  • 2020-08-02
相关资源
最近更新 更多