2016-12-14 40 views
0

我有一個存儲爲varchar的十進制值的數據集。 我需要返回所有小於8.0的值。 這是我的查詢:將數據類型varchar轉換爲sql中的數值時出現錯誤當在條款中比較值時

;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 

當我運行此查詢我得到的錯誤:

converting data type varchar to numeric

當我運行的查詢,而無需在where子句中值的範圍從5.0到16.9。 另一列僅僅是一個標識字段。 將Value字段轉換爲CTE查詢中的數字。
爲什麼可以在where子句中出錯?

UPDATE 總的行數是228.應該有144個返回,但只返回39個。

+0

http://stackoverflow.com/q/41109677/6167855 – scsimon

+0

小心使用ISNUMERIC隔離是值實際上數字。事物「1e8」,「¢」,「$」。將全部用isnumeric評估爲1,但會用謂詞拋出異常。對我來說,你最大的問題就是在varchar列中存儲你確定的十進制數。你顯然有一些實際上不是小數的值。 –

回答

0

這是查詢優化程序決定將查詢作爲單個查詢執行的結果。它結合了所有WHERE條件並選擇在ISNUMERIC檢查前執行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的重點。謝謝! –

相關問題