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

时间:2018-07-05 13:39:31

标签: sql sql-server tsql casting decimal

这个问题可能在很多线程上都可以回答,但是我找不到针对我问题的答案。

Q:我从API(以json格式)获取数据,其中所有列均以字符串形式出现,并插入到具有所有列作为字符串并用作源表的表中。

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

我最终调试了一个问题,发现在从API提取数据期间,该过程会将数据返回为json格式,从而将值转换为某种异常格式。

例如0.00007转换为7E-05,其他许多行都在发生这种情况。

我知道我可以在API实施级别解决此问题。但是我要求在SQL Server端解决此问题。因此,我需要一个将7E-05转换为0.00007的解决方案。

2 个答案:

答案 0 :(得分:5)

尝试类似的东西:

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

结果:

0.00007000

CASTFLOAT,然后到DECIMAL

答案 1 :(得分: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的强制类型转换将返回您期望的数字。

我对投票表示满意,但您应该接受肖恩的回答,因为它早于我的回答:-D