2011-09-16 4 views
0

私は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

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

エラーメッセージのための句は:datetimeデータ型にvarcharデータ型の変換は、範囲外の値になりました。

私は高い

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

エラーメッセージのために書く:エラーが浮かぶようにデータ型varchar型に変換します。

where節のためのwritngの間に、最低値または最低値のレコードだけを取得するにはどうすればよいですか? 値のフィールドはVARCHAR

+2

最初の問題は、数字に対して 'VARCHAR'列を評価していることです。あなたのエラーは、クエリではなく、データから来ています。その上にISNUMERICは0-9の間1を返します。 SQL Serverはカンマと日付を含む数字であると思うことがあります。 http://www.sqlservercentral.com/articles/IsNumeric/71512/ – Wil

答えて

2

CASEステートメントの評価順序は、変換できないvarcharに対してCONVERT()を呼び出すことを禁止します。 WHERE条件でこの保護を保証するものではありません。

+1

WHERE条件にISNUMERICが含まれているだけではありません。数字を含む値のみが除外されることは決してありません。 'SELECT ISNUMERIC( '。')'は、SELECT ISNUMERIC( '$ 12') 'と' ISNUMERIC( '、') 'と同様に1を返します。 – Wil

0

これは、全体がの値の列に依存することになります。私は、値が通常xx.x%として報告されるAYPやその他の標準化されたテストと同様のものだと仮定しています。その場合、次のようなものが動作します:

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 
関連する問題