条款声明

时间:2011-09-16 20:26:22

标签: tsql case

我有一个案例陈述,我想写一个单独的条款,每个条款高低中等和无。

 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) 

错误MSg:将varchar数据类型转换为日期时间数据类型会导致超出范围的值。

当我写高

 SELECT class
               ,rollno
               ,Value
        FROM STUDENT
        WHERE (CONVERT(FLOAT,REPLACE(ldd.Value, '%', '')) > 9.0)

错误MSg:将数据类型varchar转换为float时出错。

在where子句写入时,只能获取高低或无高的记录? 价值领域是变量

2 个答案:

答案 0 :(得分:2)

CASE语句的评估顺序阻止您在无法转换的varchar上调用CONVERT()。您无法保证在WHERE条件下获得此保护。

答案 1 :(得分:0)

这将完全依赖于 列中的内容。我假设它们类似于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