というテーブルがありますExamInfo
。そのテーブルでは、列Sub1
のタイプはVARCHAR(50)
です。Sub1 列には、数値、null、および非数値データが含まれます。
Sub1 のデータが 81 より大きい ExamInfo から選択したいと考えています。
これが私のクエリです:
select *
from Exam
where cast(sub1 as int) > 81`.
しかし、キャストに失敗してエラーが発生します。
というテーブルがありますExamInfo
。そのテーブルでは、列Sub1
のタイプはVARCHAR(50)
です。Sub1 列には、数値、null、および非数値データが含まれます。
Sub1 のデータが 81 より大きい ExamInfo から選択したいと考えています。
これが私のクエリです:
select *
from Exam
where cast(sub1 as int) > 81`.
しかし、キャストに失敗してエラーが発生します。
列には混合情報が含まれており、キャストは列全体に適用されるため、実際の数値のみをキャストしようとすることを確認する必要があります。
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