【问题标题】:Casting Scientific Notation (from varchar -> numeric) in a view在视图中转换科学记数法(来自 varchar -> numeric)
【发布时间】:2011-07-19 15:43:53
【问题描述】:

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

我想要数值。所以我有这个 test 有效的查询:

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。当我更改第二个 WHEN 以包含 CAST 时,它会中断/给出错误的结果。

【问题讨论】:

  • 您发布的代码对我来说工作正常...当我更改为 E+12 时,CASE 的输出是 820000000000000

标签: sql sql-server-2008


【解决方案1】:

这里同时出现了几个不同的问题。让我们看看其中的一些:

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

  2. 在添加“WHEN @d like '%E+%' THEN CAST(@d AS FLOAT)”的情况下,对于

  3. 您需要始终如一地对结果进行 LTRIM 和 RTRIM。您可以将 LTRIM 和 RTRIM 添加到每个案例语句中,也可以只将 LTRIM 和 RTRIM 添加到案例的结果中。

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

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))

【讨论】:

  • 我花了一上午的时间在这上面。在我发布这个问题后,我在 5 分钟后发现了自己的问题。感谢您的解释。
  • 先生对此表示非常感谢.. 工作就像魅力!永远保持祝福:)
【解决方案2】:

您可以使用 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'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多