在 SQL 中转换/转换科学记数法 [从 Varchar 到 Decimal/Numeric]
Posted
技术标签:
【中文标题】在 SQL 中转换/转换科学记数法 [从 Varchar 到 Decimal/Numeric]【英文标题】:Transform/Convert Scientific Notation [From Varchar to Decimal/Numeric] in SQL 【发布时间】:2020-10-01 12:08:36 【问题描述】:我有一个表,其中一列带有如下值。该列的数据类型为 VARCHAR。现在,为了客户体验,我必须将以下值转换为实际的非科学符号[参考结果]。请帮助我实现这一目标。
输入值:
1.1706260317772036d-3
3.0820440115884856d-4
5.584098106752352d-4
6.477217523714287d-4
3.897560962029404d-4
0
结果
0.0011706260317772036
0.00030820440115884856
0.0005584098106752352
0.0006477217523714287
0.0003897560962029404
0
我尝试了以下这些但没有帮助。
select CAST(CAST('3.8761442700897326d-4' AS FLOAT) AS bigint)
SELECT CAST('3.8761442700897326d-4' as REAL)
谢谢。
【问题讨论】:
参见mysql 8.0 Reference Manual / ... / Numeric Literals -E
,而不是使用D
。
【参考方案1】:
REPLACE(str,'d', 'e') + 0
或者,在数字上下文中,只是
REPLACE(str,'d', 'e')
fiddle
【讨论】:
这在 redshift 中不起作用......对不起,我错过了更新这个。这只是结果为“3.8761442700897326e-40” @user3624000 Amazon RedShift 也将E
用于科学计数法 (Integer and floating-point literals),+
仅用于数字运算 (Compound expressions),REPLACE function 具有相同的语法。如果+
符号导致字符串连接,那么您可以访问 RedShift,但您的代码是 NOT SQL 代码。【参考方案2】:
你可以这样表述:
select '3.8761442700897326d-4' + 0
我不确定您想要的结果;你的字符串中有d
,但结果看起来像你想要的e
。您可能需要在转换前更换:
select replace('3.8761442700897326d-4', 'd', 'e') + 0
【讨论】:
我在 RESULT 部分给出了期望......这个select '3.8761442700897326d-4' + 0
dint 帮助。我必须做一些转换?
@user3624000:见我回答的第二部分。
这在 redshift 中不起作用......对不起,我错过了更新这个。这只是结果为“3.8761442700897326e-40”
@user3624000:您的问题从 MySQL 问题开始,相应地发布了 3 个答案。 Redshift 是一个不同的数据库,所以很可能这三个答案都不起作用。您的编辑基本上使所有现有答案无效。我只能建议从一开始就使用正确的标签提出一个新问题。【参考方案3】:
让我假设d
真的是e
,这是实数指数的标准。如果需要,您可以使用replace()
进行更改。
你可以转换成float
:
select CAST('3.8761442700897326e-4' AS float)
这不符合您的要求,因为 float
不够大。
select CAST('3.8761442700897326e-4' AS double)
这就是你想要的。但是,它受限于小数位数。我建议将值存储为decimal
而不是double
,但这是另一回事。
但是,转换为double
(或float
)可能会更改最低位数字。如果要保留所有内容,则希望尽快将值设为decimal()
,然后进行算术运算:
select cast(left(val, 18) as decimal(38, 16)) * power(10, right(val, 2)) as x
from (select '3.8761442700897326e-4' as val) x
Here 是一个 dbfiddle。
【讨论】:
以上是关于在 SQL 中转换/转换科学记数法 [从 Varchar 到 Decimal/Numeric]的主要内容,如果未能解决你的问题,请参考以下文章