如何解决“将varchar转换为浮动”错误

时间:2013-04-29 15:54:23

标签: sql sql-server-2008-r2 varchar

我的源表中有一个非数字值的表 我正在使用CTE过滤到一组全数字的值。

但是,当我尝试将已过滤的列表转换为float时,我收到错误。

目标是找到所有小于8.0的实验室结果

CTE:

;with labs AS (

    SELECT  LabResult_Result
    FROM VIEW_PatientLabResult
    WHERE (LabResult_DateTimeOfObservation between '1/1/2012' and '1/1/2013') and
       MasterLabCode_Description='Hemoglobin (Hgb) A1c' 

)

结果大约250行,所有这些都是十进制的(手动检查)。

无法将它们转换为float以进行比较。我到目前为止最好的是:

select * from 
    (
            select *, CAST( labresult_result as float) as Converted
            FROM labs
    ) Conv
    WHERE Conv.Converted < 8.0

这导致Error converting data type varchar to float.

如果没有WHERE子句,查询运行正常。

我在想SQL正在尝试在CTE过滤器之前转换整个结果。有没有办法让它按顺序运行?

1 个答案:

答案 0 :(得分:0)

SQL仅保证使用case语句时的执行顺序。 (尽管Aaron指出,对于group by表达式中的聚合值,为真。)

请改为尝试:

select *
from (select *, (case when ISNUMERIC(labresult_result) = 1 then CAST(labresult_result as float)
                 end) as Converted
      FROM labs
     ) conv
where conv.converted < 8.0

在原始查询中,SQL可以自由重新排列where子句以优化查询 - 即使在CTE和子查询之间也是如此。这可能会导致意外错误。请记住,SQL是描述输出的描述性语言,而不是指定事物处理方式的过程语言。