我正在尝试对我的数据库中的一列进行平均。该列是 AMOUNT
并存储为 NVARCHAR(300),null
。
当我尝试将其转换为数值时,出现以下错误:
消息 8114,第 16 级,状态 5,第 1 行
将数据类型 NVARCHAR 转换为 NUMBER 时出错
这是我现在所拥有的。
SELECT AVG(CAST(Reimbursement AS DECIMAL(18,2)) AS Amount
FROM Database
WHERE ISNUMERIC(Reimbursement) = 1
AND Reimbursement IS NOT NULL
原文由 Pat Doyle 发布,翻译遵循 CC BY-SA 4.0 许可协议
你会认为你的代码会起作用。但是,SQL Server 不保证
WHERE
子句在SELECT
的转换发生之前过滤数据库。在我看来,这是一个错误。在微软看来,这是一项优化功能。因此,您的
WHERE
不能保证正常工作。即使使用 CTE 也不能解决问题。最好的解决方案是
TRY_CONVERT()
在 SQL Server 2012+ 中可用:在早期版本中,您可以使用
CASE
。CASE
确实 保证了子句的顺序,所以:因为
AVG()
忽略了NULL
值,所以WHERE
不是必需的,但如果您愿意,可以包含它。最后,您可以使用计算列来简化代码:
然后您可以将代码编写为: