SQL,如何将VARCHAR转换为bigint?

30

我有一个字段是 VARCHAR(6),我试图将它插入到另一张类型为 bigint 的表中,但是出现了错误

(Error Converting from data type varchar to bigint)

这是我的操作:

CONVERT(bigint, seconds) as seconds

有人可以帮忙解决这个问题吗?


你是否检查过数据,确保要转换的字段中的值实际上可以转换为整数? - Paul Sasik
似乎你的varchar类型有一个无法转换... - Raphaël Althaus
我有一个值,可能是null、负数或正数!但我已经使用isnull(second, 0)了,但问题仍然存在。将(bigint, ISNULL(ts.TimeInSeconds,0))转换为秒。 - Jaylen
2
尝试使用 where isnumeric(seconds) = 0 查找它。 - dotjoe
isnumeric(seconds) = 0 没有帮助,但给了我一个想法,最终解决了问题。 Convert(bigint, isnumiric(ts.TimeInSeconds) ) AS second非常感谢您的帮助。 - Jaylen
4个回答

47

这是答案

(CASE
  WHEN
    (isnumeric(ts.TimeInSeconds) = 1) 
  THEN
    CAST(ts.TimeInSeconds AS bigint)
  ELSE
    0
  END) AS seconds

3
您可能需要编辑此内容以使其正确,因为 isnumiric 不存在(请检查拼写)。此外,即使 CONVERT()(和 ISNUMERIC())在您的计算机上可以工作,但您已将您的问题标记为“sql”,这是一种_语言_ - 您的计算机具有特定的_实现_(SQL Server)。标准是 CAST(... as BIGINT) - 对于未来的观众,最好要么使用相关RDBMS标记您的问题,要么编写一个“标准”版本。 - Clockwork-Muse
所以你想要的是,如果TimeInSeconds中的值是有效整数,则插入1,如果不是有效整数,则插入0?你不想在TimeInSeconds列中插入值吗? - Mikael Eriksson
我在找出问题后纠正了我的答案。再次感谢你们的帮助 :) - Jaylen

8

另一种选择是这样做:

SELECT
   CAST(P0.seconds as bigint) as seconds
FROM
   (
   SELECT
      seconds
   FROM
      TableName
   WHERE
      ISNUMERIC(seconds) = 1
   ) P0

3

我认为你的代码是正确的。如果你运行以下代码,它会将被视为 varchar 的字符串 '60' 转换为整数 60,如果第二个参数中包含整数字符串,则它也能正常工作。

select CONVERT(bigint,'60') as seconds 

它会返回什么?
60

-1

在这个问题上出现了一个小问题,当文本中的'number'有一个小数点时,在TSQL中至少会导致上面的解决方案无法工作。

只是发帖以防对其他人有所帮助。让我疯狂了一个小时。 一个解决方案似乎是先转换为浮点数,然后再转换为大整数。

select cast(1234567891011.0 as varchar(50)) as numb1 into #t1; select * from #t1;

select numb1 ,cast(numb1 as bigint) as numb1x from #t1; --将数据类型varchar转换为bigint时出错。

--尽管它是一个数字: select numb1 ,isnumeric(numb1) as isnumb from #t1;

--上述提出的解决方案失败: select numb1, CASE WHEN isnumeric(numb1)=1 then cast(numb1 as bigint) ELSE 0 END as numb1x from #t1; --将数据类型varchar转换为bigint时出错。

--有效的解决方案: select numb1 ,cast(cast(numb1 as float) as bigint) as numb1x from #t1;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接