如何在sql中将varchar转换为int

时间:2012-06-25 08:03:11

标签: asp.net sql sql-server-2000

我有一个叫ExamInfo的表。在该表中,Sub1列的类型为VARCHAR(50)。 Sub1列包含数字 null 非数字数据。

我想从ExamInfo中选择Sub1中的数据大于81的数据。

这是我的问题:

select * 
from Exam 
where cast(sub1 as int) > 81`.

但它无法投射导致错误。

3 个答案:

答案 0 :(得分:4)

由于您的列包含混合信息,并且强制转换应用于整个列,因此您需要确保只尝试转换实际数值:

select * 
from Exam 
where case when ISNUMERIC(sub1) =1
            and CHARINDEX('.', sub1) = 0 
            and sub1 >= -2147483648 
            and sub1 <= 2147483647
           then cast(sub1 as int) 
           else 0 
      end > 81

这是一个关于如何在SQL Server中执行此操作的示例。

此查询还有一个注意点,那就是“全球化”。 '。'我们正在检查小数点是不是到处都用作小数点。如果您有本地化的SQL Server,则可以通过执行

来获取正确的小数分隔符
DECLARE @decimal_separator char(1)
set @decimal_separator = SUBSTRING(CONVERT(CHAR(3), CONVERT(NUMERIC(2,1), 1.0/2)), 2, 1)

将查询转换为:

DECLARE @decimal_separator char(1)
set @decimal_separator = SUBSTRING(CONVERT(CHAR(3), CONVERT(NUMERIC(2,1), 1.0/2)), 2, 1)

select * 
from Exam 
where case when ISNUMERIC(sub1) =1
            and CHARINDEX(@decimal_separator, sub1) = 0 
            and sub1 >= -2147483648 
            and sub1 <= 2147483647
           then cast(sub1 as int) 
           else 0 
      end > 81

答案 1 :(得分:1)

看起来sub1中的某些数据无法转换为int。检查数据是否有非数字数据。

答案 2 :(得分:0)

试试这个:

 SELECT * FROM ExamInfo
 WHERE  CAST( (CASE 
                WHEN ISNUMERIC(Sub1) <> 1 
                    THEN NULL
                --Ignore any decimal value
                WHEN ISNUMERIC(Sub1 + '.0e0') <> 1                  
                    THEN NULL
                WHEN CAST(Sub1 AS NUMERIC(38, 0)) BETWEEN -2147483648 AND 2147483647
                    THEN Sub1       
                ELSE null 
              END) AS INT ) > 81;