我注意到了一些奇怪的行为,并希望其中一位专家可以解释差异。我的UI要求图像在提交给用户执行任务之前是唯一的。我将校验和存储在数据库中,并向其查询唯一值。我注意到我的逻辑“翻转”取决于我是否使用标准的SELECT查询还是SELECT COUNT。我已经将其隔离到此代码行中,但我不明白为什么。
从表中选择记录,在 checksum =某项
//This code works correctly (true / false)
Object result = command.ExecuteScalar();
bool checksumExists = (result == null ? false : true);
//Returns TRUE no matter what
Object result = command.ExecuteScalar();
bool checksumExists = (result == DBNull.value ? false : true);
我更改为以下SQL,以提高针对大表的性能,并且逻辑“跳动”
从表中的SELECT COUNT( record )条记录中, checksum =某项
//Now this code always returns TRUE
Object result = command.ExecuteScalar();
bool checksumExists = (result == null ? false : true);
//Now this is the solution
Object result = command.ExecuteScalar();
bool checksumExists = (Convert.ToInt32(result) < 1 ? false : true);
COUNT语句是否意味着即使没有找到行也总是返回一个数字?
答案 0 :(得分:4)
COUNT语句是否意味着即使没有找到行也总是返回一个数字?
是的。零是一个数字。和
SELECT COUNT(someCol) c FROM table WHERE 1=2
将始终返回单行,单列结果集,例如:
c
-----------
0
(1 row affected)
COUNT不是检查任何行是否符合条件的最有效方法,因为它将继续计算除第一行之外的所有行。
您可以使用EXISTS或TOP 1生成查询,该查询将在找到单行后停止。 EG
select someMatchesExist = case when exists(select * from table where ...) then 1 else 0 end
或
select top (1) 1 as someMatchesExist from table where ...