【发布时间】:2011-09-17 04:55:47
【问题描述】:
我有一个 case 语句,我想为每个 HIGH LOW MEDIUM 和 NONE 编写单独的 where 子句。
CASE
WHEN (ISNUMERIC(REPLACE(ldd.Value, '%', '')) = 0)
THEN 'NONE'
WHEN (CONVERT(FLOAT,REPLACE(ldd.Value, '%', '')) > 9.0)
THEN 'HIGH'
WHEN (CONVERT(FLOAT,REPLACE(ldd.Value, '%', '')) < 7.0 )
THEN 'LOW'
WHEN (CONVERT(FLOAT,REPLACE(ldd.Value, '%','')) BETWEEN 7.0 AND 9.0 )
THEN 'MEDIUM'
WHEN (ISNULL(ldd.Value,'') = '')
THEN 'NONE'
END
当我尝试为 NONE 编写 where 子句时
SELECT class
,rollno
,Value
FROM STUDENT
WHERE (ISNUMERIC(REPLACE(ldd.Value, '%', '')) = 0)
错误消息:将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
当我写高时
SELECT class
,rollno
,Value
FROM STUDENT
WHERE (CONVERT(FLOAT,REPLACE(ldd.Value, '%', '')) > 9.0)
错误消息:将数据类型 varchar 转换为浮点数时出错。
在为 where 子句编写时,如何仅获取高低记录或无记录? 值字段是 VARCHAR
【问题讨论】:
-
您的第一个问题是您正在根据数字评估
VARCHAR列。您的错误来自数据,而不是查询。最重要的是,ISNUMERIC将返回 1 超过 0-9; SQL Server 认为有很多东西是数字的,包括逗号和日期。 sqlservercentral.com/articles/IsNumeric/71512