Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql WHERE子句的CASE语句_Tsql_Case - Fatal编程技术网

Tsql WHERE子句的CASE语句

Tsql 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语句,我想为每个case语句分别写where子句HIGH-LOW-MEDIUM和NONE

 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字段是VARCHAR

CASE语句的求值顺序阻止您对无法转换的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