0

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

但是,当我尝试将过滤后的列表转换为浮动时,出现错误。

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

热电偶:

;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 行,所有这些都是十进制的(手动检查)。

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

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 过滤器之前转换整个结果。有没有办法让它按顺序运行?

4

1 回答 1

0

caseSQL 仅在您使用语句时保证执行顺序。(尽管正如 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 是一种描述输出的描述性语言,而不是一种指定如何处理事物的过程语言。

于 2013-04-29T16:04:15.643 回答