您会认为您的代码可行。但是,SQL Server不保证SELECT
的转换发生前WHERE
子句筛选数据库。在我看来这是一个错误。在微软看来,这是一项优化功能。
因此,您的WHERE
不能保证工作。即使使用CTE也不能解决问题。
最好的解决办法是在SQL Server 2012+ TRY_CONVERT()
可供选择:
SELECT AVG(TRY_CONVERT(DECIMAL(18,2), Reimbursement)) AS Amount
FROM Database
WHERE ISNUMERIC(Reimbursement) = 1 AND Reimbursement IS NOT NULL;
在早期版本中,你可以使用CASE
。该CASE
确实保证条款的顺序排序,所以:
SELECT AVG(CASE WHEN ISNUMERIC(Reimbursement) = 1 AND Reimbursement IS NOT NULL
THEN CONVERT(DECIMAL(18,2), Reimbursement))
END)
FROM Database;
因为AVG()
忽略NULL
值,该WHERE
是没有必要的,但你可以包括,如果你喜欢。
alter database add Reimbursement_Value as
(CASE WHEN ISNUMERIC(Reimbursement) = 1 AND Reimbursement IS NOT NULL
THEN CONVERT(DECIMAL(18,2), Reimbursement))
END);
然后,你可以写代码:
select avg(Reimbursement_Value)
from database
where Reimbursement_Value is not null;
好像你在该列中一些非数值
最后,你可以通过使用计算列简化代码... – jarlh
您正在使用哪个版本的SQLServer? – TheGameiswar