我的源表中有一个非数字值的表 我正在使用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过滤器之前转换整个结果。有没有办法让它按顺序运行?
答案 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是描述输出的描述性语言,而不是指定事物处理方式的过程语言。