将JSON字符串转换为十进制的问题

问题描述 投票:1回答:2

这个问题可能会在许多线程上回答,但我无法找到特定于我的问题的答案。

问:我从API(以json格式)获取数据,其中所有列都以字符串形式出现并插入到一个表中,该表将所有列作为字符串并用作源表。

现在,我正在尝试将数据从该源转换为目标,并进行所有必要的转换以将数据插入目标表。但十进制(16,8)投射失败。

我在我的端调试问题,并发现在从API获取数据期间,将数据返回到json格式,以某种不寻常的格式转换值。

对于例如0.00007转换为7E-05,这发生在许多其他行上。

我知道我可以在API实现级别修复此问题。但我要求在SQL服务器端解决这个问题。所以我需要一个能将7E-05转换成0.00007的解决方案。

sql sql-server tsql casting decimal
2个回答
2
投票

这种不寻常的格式是一种相当常见的科学符号Wikipedia, read section "E-notation"

你看到E和一个数字意味着指数。

"1E2"  = 1 * 10^2 = 100
"1E-2" = 1 * 10^(-2) = 0.01

试试这个:

DECLARE @tbl TABLE(Numberstring VARCHAR(100));
INSERT INTO @tbl VALUES('100'),('1E2'),('1E-2'),('7E-05');
SELECT Numberstring
      ,CAST(Numberstring AS FLOAT) 
      ,CAST(CAST(Numberstring AS FLOAT) AS DECIMAL(20,10)) 
FROM @tbl;

结果

100     100     100.0000000000
1E2     100     100.0000000000
1E-2    0,01    0.0100000000
7E-05   7E-05   0.0000700000

您可以看到,FLOAT类型本身将以科学记数法显示最后一个,而对DECIMAL的演员将返回您期望的数字。

我会对upvote感到满意,但是你应该接受Shawn的答案,因为它早于我的答案:-D


5
投票

尝试类似的东西:

SELECT CAST(CAST(@t AS FLOAT) AS DECIMAL(16,8))

结果是:

0.00007000

CASTFLOAT,然后到DECIMAL

© www.soinside.com 2019 - 2024. All rights reserved.