sql - 是否与空值定义的行为进行比较?
问题描述
在最近的一次代码审查中,我被要求更改
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
解决方案
amount > 0
检查是否amount
严格大于0
。如果值为NULL
,则条件返回unknown
(不是true
,但实际上不是false
)..
ISNULL(amount, 0) > 0
做同样的事情。NULL
值被转换为0
,这也使检查失败 - 但是在这种情况下false
返回而不是unknown
.
根据您要对条件结果执行的操作,这两个条件的行为可能相同,也可能不同。例如,如果您在where
子句中使用它,则没有显着差异。然而,第二个条件效率较低,因为它需要额外的计算,并且可能无法利用 上的现有索引amount
(如果有)。
推荐阅读
- android - 使用android从API获取JSON
- angular - 从 Firebase 推送返回响应
- node.js - 如何在 Docker 节点项目中使用 nodemon?
- swift - SD Web 图像未从 Firebase URL 缓存到磁盘
- sql-server - sql: 求多维数据集中的最大数
- r - 根据先前的行改变数据帧的行
- autocomplete - 将自动完成功能与 Google Place API 一起使用会出现错误
- c# - 查找文件时如何忽略字符串中的子字符串?
- java - Selenium - 如何让驱动程序等到 DOM 元素完成刷新
- regex - 如何编写正则表达式来查找/替换 HTML 类?