首页 > 解决方案 > 是否与空值定义的行为进行比较?

问题描述

在最近的一次代码审查中,我被要求更改

Amount > 0

ISNULL(Amount,0) > 0

这些是否有可能产生不同的结果?据我所知,如果 Amount 为 null 或 0,它们都将返回 false,在任何其他情况下返回 true

为了提供更多详细信息,我想获取一个表中的所有行,只要它们在第二个表中没有对应的行且数量 > 0

-- Get members that do not have unpaid fees
Select m.Name from Members m
left join Fees f on m.Id = F.memberId and F.AmountDue > 0
where F.memberId is null

标签: sqlsql-serverleft-joinwhere-clausesql-null

解决方案


amount > 0检查是否amount严格大于0。如果值为NULL,则条件返回unknown(不是true,但实际上不是false)..

ISNULL(amount, 0) > 0做同样的事情。NULL值被转换为0,这也使检查失败 - 但是在这种情况下false返回而不是unknown.

根据您要对条件结果执行的操作,这两个条件的行为可能相同,也可能不同。例如,如果您在where子句中使用它,则没有显着差异。然而,第二个条件效率较低,因为它需要额外的计算,并且可能无法利用 上的现有索引amount(如果有)。


推荐阅读