1

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

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

这是我的查询:

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

但它无法投射导致错误。

4

3 回答 3

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
于 2012-06-25T08:07:22.817 回答
1

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

于 2012-06-25T08:05:33.103 回答
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;
于 2012-06-25T09:28:18.033 回答