在 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]的主要内容,如果未能解决你的问题,请参考以下文章

在没有科学计数法的 SQL Server 中将 float 转换为 varchar

如何把SQL server 表里插入转换科学计数法的方法。

sql 将数字转换为varchar 怎么会变成16进制

sql动态实现行列转换

如何在 SQL 中将指数和系数转换为整数值

科学记数法和从 DB 输出到 Python 中 JSON 的转换