tSQL - 从 varchar 到数字的转换适用于除整数之外的所有内容



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

SELECT CAST(VarcharCol AS INT) FROM MyTable
SELECT CONVERT(INT, VarcharCol) FROM MyTable

对于每种数值,这些都适用于我,但integer - 我可以很好地转换为 floatdecimal 等,但尝试转换为 integer 会给我以下错误:

转换

varchar 值"7082.7758172"时转换失败数据类型为 int。

我已经通过转换为数据类型 Decimal(6,0) 来解决此问题,这工作正常。但仅就我的教育而言,谁能告诉我为什么转换为数据类型 int(或 integer)会给我一个错误?谢谢。

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

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

下面的任一示例都将返回 7082:

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

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

实际上是否有数字无关紧要。这。(点) 是禁止的,如果你想投射到 int。从逻辑上讲,点不能成为整数定义的一部分,所以即使:

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

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

大概,您希望将小数位之前的值转换为整数。 如果是这样,请使用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;

试试这个

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

尝试以下查询:

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

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

SELECT
  convert(numeric(18,5),Col1), Col2
     FROM DBname.dbo.TableName
         WHERE isnumeric(isnull(Col1,1)) <> 0

相关内容

最新更新