微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

由于我无法帮助的原因,我有一个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时,它会中断/给出错误的结果.

解决方法

同时在这里汇集了几个不同的问题.我们来看看其中一些:

>你将数字作为DECIMAL(18,18).这意味着“给我一个有18个字符的空间的数字,其中18个应该在十进制之后”.只要您的数字小于0(对于所有电子数字都是如此),它就可以正常工作但如果您尝试在数字上使用它,它将会中断> 0.对于数字> 0,只是转换为DECIMAL而不指定任何其他内容.
>如果您添加“当@d像’%E%’那么CAST(@d AS FLOAT)”时,您会得到不同的数字结果< 0因为引擎以不同方式隐式地转换结果.我不知道有关sql server如何决定转换CASE结果的规则,但显然提出你的建议更改会导致引擎以不同的方式重新生成它.将这些结果显式地转换为十进制修复问题.
>你需要LTRIM和RTRIM一致的结果.您可以为每个case语句添加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))

原文地址:https://www.jb51.cc/mssql/83647.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐