2016-12-14 14 views
0

varcharとして格納されている10進値のデータセットがあります。 8.0より小さいすべての値を返す必要があります。 これは私のクエリです:私はこのクエリを実行すると値が比較されるときにデータ型varcharを数値に変換するエラー。where句で

;WITH CTE 
AS 
(
SELECT PatientEncounterID, CAST(value as numeric(3,1)) As Value 
from Observation 
where Term = 'HGBA1C' AND isnumeric(value) = 1 
) 
SELECT * 
FROM CTE 
WHERE Value < 8.0 

私はエラーを取得する:私は、WHERE句なしでクエリを実行すると

converting data type varchar to numeric

値は5.0から16.9までの範囲。 他の列は単なるIDフィールドです。 Valueフィールドは、CTEクエリの数値に変換されます。
なぜwhere句にエラーがありますか?

更新日 合計行は228です。返されるのは144ですが、39が返されます。

+0

http://stackoverflow.com/q/41109677/6167855である値を隔離するISNUMERICを使用して注意してください – scsimon

+0

実際の数字。物 "1e8"、 "¢"、 "$"すべてが1で評価されますが、あなたの述語で例外がスローされます。私にとっては、あなたが持っている最大の問題は、varcharの列に10進数で何を決定するかを格納することです。あなたは明らかに実際に小数ではないいくつかの値を持っています。 –

答えて

0

これは、クエリオプティマイザがクエリを単一のクエリとして実行することを決定した結果です。 WHEREの条件をすべて組み合わせ、のチェックの前にValue < 8.0のチェックを実行することを選択します。これを回避するには、まず、すべての数値をフィルタリングし、一時テーブルに置く必要があります。

INSERT INTO #TempTable 
SELECT * 
FROM Observation 
WHERE 
    Term = 'HBGAIC' 
    AND ISNUMERIC(Value) = 1; 

SELECT * 
FROM #TempTable 
WHERE CAST(Value AS NUMERIC(3, 1)) < 8.0; 
+0

それはうまくいった!うわー...それは考えていないだろう。私はそれがCTEの全体のポイントだと思った。ありがとう! –

関連する問題