【问题标题】:CASE STATEMENT TO WHERE CLAUSE案例声明
【发布时间】: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

标签: tsql case


【解决方案1】:

CASE 语句的求值顺序可防止您在无法转换的 varchar 上调用 CONVERT()。不保证您在 WHERE 条件下获得此保护。

【讨论】:

  • 不仅如此,他的 WHERE 条件还包括 ISNUMERIC,它绝不保证只过滤掉包含数字的值。 SELECT ISNUMERIC('.') 返回 1,SELECT ISNUMERIC('$12')SELECT ISNUMERIC(',') 也是如此。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2023-03-02
    相关资源
    最近更新 更多