2016-12-14 2 views
0

Ich habe ein Dataset mit Dezimalwerten, die als varchar gespeichert werden. Ich muss alle Werte zurückgeben, die kleiner als 8.0 sind. Dies ist meine Frage:Fehler beim Konvertieren des Datentyps varchar in numerisch in sql, wenn der Wert in where-Klausel verglichen wird

;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 

Wenn ich diese Abfrage ausführen bekomme ich den Fehler:

converting data type varchar to numeric

Wenn ich die Abfrage ausführen, ohne die Klausel, wo die Werte von 5,0 bis 16,9 liegen. Die andere Spalte ist nur ein Identitätsfeld. Das Feld Value wird in eine Zahl in der CTE-Abfrage konvertiert.
Warum kann der Where-Klausel-Fehler?

UPDATE Die Gesamtzahl der Zeilen ist 228. Es sollte 144 zurückgegeben werden, aber nur 39 zurückgegeben werden.

+0

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

+0

Vorsicht ISNUMERIC unter Verwendung von Werten zu isolieren, sind eigentlich Zahlen. Dinge "1e8", "¢", "$." Alle werden mit isnumeric zu 1 ausgewertet, werfen aber eine Ausnahme mit Ihrem Prädikat auf. Für mich ist das größte Problem, das Sie haben, das zu speichern, was Sie in einer varchar-Spalte als dezimal deklarieren. Sie haben offensichtlich einige Werte, die keine Dezimalzahlen sind. –

Antwort

0

Dies ist ein Ergebnis des Abfrageoptimierers, der entscheidet, die Abfrage als einzelne Abfrage auszuführen. Es kombiniert alle Ihre WHERE Bedingungen und wählt, um die Prüfung vor der ISNUMERIC Prüfung durchzuführen. Um dies zu umgehen, müssen Sie zuerst alle numerischen Werte filtern und in einer temporären Tabelle setzen:

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

Das hat funktioniert! Wow ... hätte daran nicht gedacht. Ich dachte, das ist der springende Punkt eines CTE. Vielen Dank! –

Verwandte Themen