我有一个叫ExamInfo
的表。在该表中,Sub1
列的类型为VARCHAR(50)
。 Sub1列包含数字, null 和非数字数据。
我想从ExamInfo中选择Sub1中的数据大于81的数据。
这是我的问题:
select *
from Exam
where cast(sub1 as int) > 81`.
但它无法投射导致错误。
答案 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;