我有桌子叫ExamInfo
。在该表中,该列Sub1
的类型为VARCHAR(50)
。Sub1 列包含数字、空和非数字数据。
我想从 Sub1 中的数据大于 81 的 ExamInfo 中进行选择。
这是我的查询:
select *
from Exam
where cast(sub1 as int) > 81`.
但它无法投射导致错误。
我有桌子叫ExamInfo
。在该表中,该列Sub1
的类型为VARCHAR(50)
。Sub1 列包含数字、空和非数字数据。
我想从 Sub1 中的数据大于 81 的 ExamInfo 中进行选择。
这是我的查询:
select *
from Exam
where cast(sub1 as int) > 81`.
但它无法投射导致错误。
由于您的列包含混合信息并且转换应用于整个列,因此您需要确保仅尝试转换实际数值:
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
看起来 sub1 中的某些数据无法转换为 int。检查非数字数据的数据。
尝试这个:
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;