C#ExecuteScalar()空COUNT与SELECT

时间:2019-05-08 21:01:37

标签: c# sql sql-server sqlcommand executescalar

我注意到了一些奇怪的行为,并希望其中一位专家可以解释差异。我的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语句是否意味着即使没有找到行也总是返回一个数字?

1 个答案:

答案 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 ...