繁体   English   中英

在sql中将指数转换为数字

[英]Convert exponential to number in sql

我有大量的卡令牌(16 位)从 xml 文件上传到 sql-server。 问题是我将它们视为表达式,示例如下:

3.3733E+15
3.3737E+15
3.3737E+15
3.3737E+15
3.37391E+15
3.37391E+15
3.37398E+15
3.37453E+15
3.37468E+15
3.37468E+15
3.3747E+15
3.37486E+15
3.37486E+15
3.37567E+15
3.3759E+15
3.3759E+15

有什么建议可以将它们更改为 16 位数字吗? 我尝试更改数据类型,但出现错误"Conversion failed when converting the varchar value '3.37201E+15' to data type int"

感谢帮助!

编辑:

@XLant 请参阅下面的代码。 我从另一个表创建此表,该表只是从 xml 文件中插入。 这是否会因为 TOKEN 列中的某些行为空而导致错误?

 CREATE TABLE MULTICURRENCY_CHECK
    (
    TOKEN varchar(255)
    )
    /*Merges all card tokens into 1 column, as in xml they are spread across different columns*/                                
    INSERT INTO MULTICURRENCY_CHECK
    (
    TOKEN
    )
    SELECT no FROM gpstransactionsnew2
        UNION ALL
    SELECT no19 FROM gpstransactionsnew2
        UNION ALL
    SELECT no68 FROM gpstransactionsnew2
        UNION ALL
    SELECT no93 FROM gpstransactionsnew2
        UNION ALL
    SELECT no107 FROM gpstransactionsnew2
        UNION ALL
    SELECT no121 FROM gpstransactionsnew2

    SELECT REPLACE(TOKEN, 'OW1', ' ')
    FROM MULTICURRENCY_CHECK

    /*Converts exponential expression to number*/
    SELECT CONVERT(numeric(16,0), CAST(TOKEN AS FLOAT))
    FROM MULTICURRENCY_CHECK

在转换之前尝试将字符串转换为浮动:

SELECT CONVERT(numeric(16,0), CAST(TOKEN AS FLOAT))
FROM MULTICURRENCY_CHECK

我不知道您的 XML 源中这些数字的格式是什么,但是根据您提供的数据,您最终会得到 33733,例如后面跟着一堆零。 如果您的 XML 具有更高的精度,也许您应该调整您的导入设置以保持这种精度,而不是尝试在数据库中处理它。

编辑:

尝试使用ISNUMERIC测试您的字符串,以避免出现转换错误。 添加列的原始输出将允许您检查哪个值无法转换(即转换为 0)。

SELECT TOKEN, 
       CONVERT(NUMERIC(16, 0), CAST(CASE 
                                      WHEN ISNUMERIC(TOKEN) = 1
                                      THEN TOKEN 
                                      ELSE 0 
                                    END AS FLOAT)) 
FROM   MULTICURRENCY_CHECK

对于 SQL Server 2012+,请使用TRY_CONVERT()

在 xlecoustillier 的编辑答案中使用 ISNUMERIC() 并不能防止转换失败。

鉴于以下情况:

CREATE TABLE test(a varchar(100));

insert into test values ('3.3733E+15'),
('3.3737E+15'),
('3.37391E+30'), --fails conversion. included to demonstrate the nature of TRY_CONVERT().
('3.37398E+15'),
('3.37453E+15'),
('3.37468E+15'),
('3.3747E+15'),
('3.37486E+15'),
('3.37567E+15'),
('3.3759E+15');

SELECT TRY_CONVERT(numeric(16,0), CAST(a AS FLOAT))
FROM test

只产生有效的转换值:

---------------------------------------
3373300000000000
NULL
3373910000000000
3373980000000000
3374530000000000
3374680000000000
3374700000000000
3374860000000000
3375670000000000
3375900000000000

然而:

SELECT a, 
       CONVERT(NUMERIC(16, 0), CAST(CASE 
                                      WHEN ISNUMERIC(a) = 1
                                      THEN a 
                                      ELSE 0 
                                    END AS FLOAT)) 
FROM   test

失败:

将 varchar 值“3.3733E+15”转换为数据类型 int 时转换失败。

问题是“a”列中的所有值在传递给 ISNUMERIC() 函数时都返回 1。

SELECT CASE WHEN ISNUMERIC(a) = 1 THEN 'Yes' ELSE 'No' END as IsValueNumeric
FROM test

在 SQLFiddle 上试用和/或与xlecoustillier 的 sqlfiddle进行比较

SELECT colmn_name || '' FROM table_name

这应该有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM