2016-12-14 25 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的重点。谢谢! –

相关问题