ДЕЛО ЗАЯВЛЕНИЕ, ГДЕ ОГОВОРКА - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть инструкция 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

когда я пытаюсь написать предложение where для NONE

    SELECT class
           ,rollno
           ,Value
    FROM STUDENT
    WHERE (ISNUMERIC(REPLACE(ldd.Value, '%', '')) = 0) 

Ошибка MSg: преобразование типа данных varchar в тип данных datetime привело к значению вне допустимого диапазона.

Когда я пишу для высокого

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

Ошибка MSg: Ошибка преобразования типа данных varchar в число с плавающей точкой.

что можно сделать, чтобы получить только записи для высокого минимума или ни одного при записи предложения where? ЦЕННОЕ ПОЛЕ VARCHAR

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

Порядок оценки для оператора CASE не позволяет вам когда-либо вызывать CONVERT () для varchar, который не может быть преобразован. Вам не гарантирована эта защита с условием WHERE.

0 голосов
/ 17 сентября 2011

Это будет зависеть полностью от того, что находится в столбце Значение.Я предполагаю, что они похожи на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...