SQL Server 2012:插入到 varchar 列中的整数值以科学记数法显示

SQL Server 2012: integer values inserted in varchar column show up with scientific notation

我有一个 table,它在 VARCHAR 列中存储 INTEGER 个数字,似乎某些值已转换为科学记数法。

SELECT [Sales Key], cast(cast([Sales Key] as real) as float)  
FROM <table>
where [Sales Key] = '3.11886e+008'

产出

Sales Key   ConvertedValue
3.11886e+008    311886016

然而,

SELECT *
FROM <table>
where [Sales Key] = '311886016'

return没什么。

有人可以帮我理解这种行为吗? 3.11886e+008 看起来像是 311886016 的舍入表示,但为什么第二个查询无法 return 任何东西?

谢谢!

编辑:

select cast(cast('3.11886e+008' as real) as bigint) as Number
Number
311886016

实际上不应该输出 311886000 吗?

这个初始转换让我想知道当查询 运行.

时是否涉及任何类型转换

因为当你写 SQL

SELECT *
FROM <table>
where [Sales Key] = '311886016'

它正在尝试比较字符 '3.11886e+008''311886016' 不匹配。

在varchar列中,查找的是字符串匹配,不是整数值匹配。

你可以使用这个(但它会很慢):

SELECT *
FROM <table>
where cast(cast([Sales Key] as real) as float) = 311886016

显然,真正的问题是您使用了错误的数据类型,但很可能您现在无法更改它。像 Varchar 一样搜索它。

SELECT *
FROM <table>
WHERE [Sales Key] LIKE '311886016%'

Alexander 示例的缺点(我没有足够的声誉来评论他的回答)是无法使用索引(如果有的话)。

最好使用以下查询(如果值始终以科学记数法存储):

SELECT *
FROM <table>
where [Sales Key] = format(311886016, 'E')