从SQLite3查询Top3最快平均时间时如何忽略NULL/None值?
解决方法
你的问题主要出在三个地方:
- SELECT语句里误用了
averageTime IS NOT NULL,这会返回布尔值(1或0),而不是实际的平均时间数值 - 没有过滤掉
averageTime为NULL的记录,SQL默认排序时NULL会排在最前面,所以LIMIT 3优先选中了这些无数据的学生 - 循环内的print语句没有缩进,只会打印最后一条查询结果
修正后的代码如下:
print("\n\tTop 3 fastest average times:\n") print("%-3s%10s%15s%15s%15s" % ("Student ID", "Name", "Surname", "Year group", "Average time")) # 修正SQL查询:过滤NULL记录,正确选择averageTime字段,按时间升序排序 for row in c.execute('SELECT studentID, firstName, surname, yearGroup, averageTime FROM Students WHERE averageTime IS NOT NULL ORDER BY averageTime LIMIT 3'): studentID, firstName, surname, yearGroup, averageTime = row print("%-3s %15s %15s %15s %15s" % (studentID, firstName, surname, yearGroup, averageTime))
关键修正点说明:
- 添加WHERE条件:
WHERE averageTime IS NOT NULL直接排除了没有录入平均时间的学生,确保只从有有效数据的记录里筛选。 - 修正SELECT字段:把
averageTime IS NOT NULL改成averageTime,这样你拿到的是真实的平均时间值,而不是布尔判断结果。 - 排序逻辑:因为要找最快的(时间最短),所以用
ORDER BY averageTime(默认升序,数值小的在前),如果要最慢的则用ORDER BY averageTime DESC。 - 修复缩进:把print语句缩进进循环内,这样每一条查询到的记录都会被打印出来,而不是只打印最后一条。
内容的提问来源于stack exchange,提问作者Lily Crawford
相关产品推荐
相关产品推荐

