Tsql WHERE子句的CASE语句
我有一个case语句,我想为每个case语句分别写where子句HIGH-LOW-MEDIUM和NONETsql WHERE子句的CASE语句,tsql,case,Tsql,Case,我有一个case语句,我想为每个case语句分别写where子句HIGH-LOW-MEDIUM和NONE CASE WHEN (ISNUMERIC(REPLACE(ldd.Value, '%', '')) = 0) THEN 'NONE' WHEN (CONVERT(FLOAT,REPLACE(ldd.Value, '
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
错误消息:将varchar数据类型转换为datetime数据类型导致值超出范围
当我为高中写作时
SELECT class
,rollno
,Value
FROM STUDENT
WHERE (CONVERT(FLOAT,REPLACE(ldd.Value, '%', '')) > 9.0)
错误消息:将数据类型varchar转换为float时出错
在为where子句编写时,如何才能只获取high low或none的记录?
VALUE字段是VARCHARCASE语句的求值顺序阻止您对无法转换的VARCHAR调用CONVERT()。不能保证在WHERE条件下使用此保护。这将完全取决于值列中的内容。我假设它们类似于AYP或其他标准化测试,其中值通常报告为xx.x%。在这种情况下,类似这样的方法会起作用:
SELECT
s.Value
,CASE WHEN REPLACE(s.Value, '%', '') BETWEEN '0.1' AND '7.0' THEN 'LOW'
WHEN REPLACE(s.Value, '%','') BETWEEN '7.0' AND '9.0' THEN 'MEDIUM'
WHEN REPLACE(s.Value, '%', '') BETWEEN '9.0' AND '100.0' THEN 'HIGH'
ELSE 'NONE'
END
FROM Student AS s
第一个问题是,您正在根据数字计算
VARCHAR
列。您的错误来自数据,而不是查询。除此之外,ISNUMERIC
将返回1表示大于0-9;SQL Server认为有很多东西是数字的,包括逗号和日期。不仅如此,他的WHERE条件包括ISNUMERIC,这并不能保证只有包含数字的值才会被过滤掉SELECT ISNUMERIC('.')
返回1,SELECT ISNUMERIC('$12')
和SELECT ISNUMERIC(',')
。
SELECT
s.Value
,CASE WHEN REPLACE(s.Value, '%', '') BETWEEN '0.1' AND '7.0' THEN 'LOW'
WHEN REPLACE(s.Value, '%','') BETWEEN '7.0' AND '9.0' THEN 'MEDIUM'
WHEN REPLACE(s.Value, '%', '') BETWEEN '9.0' AND '100.0' THEN 'HIGH'
ELSE 'NONE'
END
FROM Student AS s