1

というテーブルがありますExamInfo。そのテーブルでは、列Sub1のタイプはVARCHAR(50)です。Sub1 列には、数値null、および非数値データが含まれます。

Sub1 のデータが 81 より大きい ExamInfo から選択したいと考えています。

これが私のクエリです:

select * 
from Exam 
where cast(sub1 as int) > 81`.

しかし、キャストに失敗してエラーが発生します。

4

3 に答える 3

4

列には混合情報が含まれており、キャストは列全体に適用されるため、実際の数値のみをキャストしようとすることを確認する必要があります。

select * 
from Exam 
where case when ISNUMERIC(sub1) =1
            and CHARINDEX('.', sub1) = 0 
            and sub1 >= -2147483648 
            and sub1 <= 2147483647
           then cast(sub1 as int) 
           else 0 
      end > 81

これは、SQLServerでそれを行う方法の例です。

このクエリにはもう1つ注意点があります。それは、「グローバリゼーション」です。'。' 小数点がどこでも小数点として使用されているわけではないため、チェックしています。ローカライズされたSQLServerを使用している場合は、次の手順を実行して正しい小数点記号を取得できます。

DECLARE @decimal_separator char(1)
set @decimal_separator = SUBSTRING(CONVERT(CHAR(3), CONVERT(NUMERIC(2,1), 1.0/2)), 2, 1)

これにより、クエリは次のようになります。

DECLARE @decimal_separator char(1)
set @decimal_separator = SUBSTRING(CONVERT(CHAR(3), CONVERT(NUMERIC(2,1), 1.0/2)), 2, 1)

select * 
from Exam 
where case when ISNUMERIC(sub1) =1
            and CHARINDEX(@decimal_separator, sub1) = 0 
            and sub1 >= -2147483648 
            and sub1 <= 2147483647
           then cast(sub1 as int) 
           else 0 
      end > 81
于 2012-06-25T08:07:22.817 に答える