11

我有一个字段中有数字的表格varchar(255)。它们都大于一并且有多个小数位。我想将它们转换为整数。根据我咨询过的每个网站,包括StackOverflow 上的这个网站,其中任何一个都应该可以工作:

SELECT CAST(VarcharCol AS INT) FROM MyTable

SELECT CONVERT(INT, VarcharCol) FROM MyTable

这些对我来说都适用于各种数值,但是integer- 我可以转换为float,decimal等就好了,但尝试转换为integer给我以下错误:

Conversion failed when converting the varchar value '7082.7758172' 
to data type int.

我通过转换为 data type 解决了这个问题Decimal(6,0),效果很好。但只是为了我的教育,谁能告诉我为什么转换为数据类型int(或integer)会给我一个错误?谢谢。

4

6 回答 6

21

当值包含小数点以防止数据丢失时,将值varchar转换为失败。int

如果先转换为 a decimalorfloat值,然后再转换为int,则转换有效。

以下任一示例都将返回 7082:

SELECT CONVERT(int, CONVERT(decimal(12,7), '7082.7758172'));
SELECT CAST(CAST('7082.7758172' as float) as int);

请注意float,在极少数情况下,转换为值可能会导致精度下降。我倾向于使用一个值,但是您需要指定对您正在转换decimal的数据有意义的精度和比例值。varchar

于 2013-09-18T16:09:07.037 回答
1

实际上是否有数字无关紧要。这 。如果要强制转换为 int,则禁止 (dot)。Dot 不能 - 从逻辑上讲 - 是 Integer 定义的一部分,所以即使:

select cast ('7.0' as int)
select cast ('7.' as int)

会失败,但两者都适合浮动。

于 2013-09-18T16:19:51.247 回答
-1

据推测,您希望将小数点的值转换为整数。如果是这样,请使用case并检查正确的格式:

SELECT (case when varcharcol not like '%.%' then cast(varcharcol as int)
             else cast(left(varcharcol, chardindex('.', varcharcol) - 1) as int)
        end) IntVal
FROM MyTable;
于 2013-09-18T16:21:48.100 回答
-1

尝试这个

declare @v varchar(20)
set @v = 'Number'
select case when isnumeric(@v) = 1 then @v
else @v end

declare @v varchar(20)
set @v = '7082.7758172'
select case when isnumeric(@v) = 1 then @v
else convert(numeric(18,0),@v) end
于 2013-09-18T16:17:10.137 回答
-1

试试这个查询:

SELECT cast(column_name as type) as col_identifier FROM tableName WHERE 1=1

在比较之前,该cast函数会将varchar类型值转换为integer类型。

于 2021-02-01T12:02:38.697 回答
-2
SELECT
  convert(numeric(18,5),Col1), Col2
     FROM DBname.dbo.TableName
         WHERE isnumeric(isnull(Col1,1)) <> 0
于 2018-07-25T00:46:34.977 回答