2016-09-22 9 views
1

私はデータベースに取り組んでいます。明るいスパークでは、文字フィールドに数字と文字を格納することをお勧めしました。charフィールドの数字を確認する

ここで、数値が特定の値以下の場所を選択する必要がありますが、レコードの一部に文字が存在するため、明らかにエラーが発生します。

私は、次の

select column1 
from table1 
where ISNUMERIC(column1)=1 
AND column1<=16 

は、しかし、私はデータに int型をvarchar型の値 '5.00' を変換するとき

の変換が失敗し、次のエラーを取得しようとしています。

これは私に数字のように見えるので、なぜそれを変換できないのですか?

答えて

0

CAST列それはNUMERIC

select column1 
from table1 
where ISNUMERIC(column1)=1 
AND CAST(column1 AS DECIMAL(18,2)) <= 16.0 
+0

を私にsytaxエラーを与えます!素晴らしいことに感謝します。 – coolblue2000

+0

前と同じエラーになります「THEN、終わり近くに不適切な構文期待AND、ORまたは」 – coolblue2000

1

これはSQL Serverの既知の問題です。 SQL Serverの2012+での正解はtry_convert()を使用することです:

select column1 
from table1 
where try_convert(int, column1) <= 16; 

クエリの問題は、SQL Serverが(他のすべてのデータベースのような)where句内の式の評価の順序を保証するものではないということです。サブクエリまたはCTEを使用してバージョンを修正することはできません.SQL Serverはクエリをコンパイルして実行するときに操作を並べ替える権利を保持するためです。

select colum1 
from table1 
where (case when isnumeric(column1) = 0 
      then 999 
      else convert(int, column1) 
     end) <= 16 

注:

は、以前のバージョンでは、caseを使用して同じことを行うことができ、本質的にこれらの両方は、文字列値が整数であることを前提としています。 10進数の場合は、変換に適切なタイプを使用します。

+0

であれば、このcase文は、これは私に優れた – coolblue2000

関連する問題