在视图中转换科学记数法(来自varchar - >数字)

时间:2011-07-19 15:43:53

标签: sql sql-server-2008

由于原因我无法帮助我拥有一个包含以下数据的varchar列:820.0E-12,10.0E + 00。

我想要数值。所以我的 测试 查询有效:

declare @d varchar(256)
set @d = '820.0E-12'
select 
   CASE 
      WHEN @d like '%E-%' THEN LTRIM(RTRIM(CAST(CAST(@d AS FLOAT) AS DECIMAL(18,18))))
      WHEN @d like '%E+%' THEN NULL
      ELSE @d
   END

我的结果是: 0.000000000820000000 (这就是我想要的)

我更改了我的SQL以考虑数字> 0(10.0E + 00)像这样:

WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)

我的结果更改为: 8.2E-10 (这不是我想要的)

如果我更改 @ d = '10 .0E + 00',那么我 10 (这是正确的)。

我有一个视图,我需要从varchar列输出,包含科学记数法,铸造/转换为十进制(18,18)。

有人可以告诉我这里有什么疯狂吗?

或者,也许我的问题应该是,如何在视图中将varchar科学记数法列转换/转换为十进制输出?

我的第一个WHEN语句适用于数字< 0但我还需要考虑数字> 0.当我更改第二个WHEN,包括 CAST 时,它会中断/给出错误的结果。

3 个答案:

答案 0 :(得分:16)

有几个不同的问题同时在这里聚集在一起。我们来看看其中一些:

  1. 您将数字转换为DECIMAL(18,18)。这意味着“给我一个有18个字符的空间的数字,其中18个应该在小数之后”。只要您的数字小于0(对于所有电子数字都是如此),它就可以正常工作但如果您尝试在数字上使用它将会中断> 0.对于数字> 0,只是在没有指定任何其他内容的情况下强制转换为DECIMAL。

  2. 如果您添加“当@d喜欢'%E +%'那么CAST(@d AS FLOAT)”时,您会得到不同的数字结果< 0因为引擎以不同方式隐式地转换结果。我不知道sql server如何决定转换CASE结果的规则,但显然提出你的建议更改会导致引擎以不同的方式重新生成它。明确地将这些结果作为十进制转换来解决问题。

  3. 您需要LTRIM和RTRIM一致的结果。您可以将LTRIM和RTRIM添加到每个案例陈述中,也可以只是LTRIM和RTRIM案例的结果。

  4. 这是一个完全解决所有问题的解决方案:

    SELECT
        LTRIM(RTRIM(CASE 
            WHEN @d like '%E-%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL(18,18))
            WHEN @d like '%E+%' THEN CAST(CAST(@d AS FLOAT) AS DECIMAL)
            ELSE @d
        END))
    

答案 1 :(得分:5)

你可以使用ISO"真实"数据类型


SELECT convert(numeric(18,18),convert(real,'820.0E-12'))
--OR with more precision
SELECT convert(numeric(18,18),convert(float(53),'820.0E-12'))

答案 2 :(得分:0)

mysql> select '820.0E-12' + 0, '10.0E+00' + 0;
+-----------------+----------------+
| '820.0E-12' + 0 | '10.0E+00' + 0 |
+-----------------+----------------+
|   0.00000000082 |             10 |
+-----------------+----------------+

也就是说,简单地向varchar添加0应该会给你一个数值。 (好的,您可能首先需要TRIM。)

m中的nFLOAT(m,n)基本上没有合理的用例;只需声明FLOAT(最多约7位有效数字)或DOUBLE(约16位)。