C # ExecuteScalar () ноль COUNT против SELECT - PullRequest
2 голосов
/ 09 мая 2019

Я заметил странное поведение и надеялся, что один из экспертов сможет объяснить разницу.Мой пользовательский интерфейс требует уникального изображения перед тем, как представить его пользователю для выполнения его задачи.Я храню контрольные суммы в базе данных и запрашиваю их для уникальных значений.Я заметил, что моя логика «переворачивается» в зависимости от того, использую ли я стандартный запрос SELECT против SELECT COUNT.Я выделил его в этой строке кода, но я не понимаю, почему.

SELECT запись ОТ таблица ГДЕ контрольная сумма = что-то

//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 ) FROM table WHERE контрольная сумма = что-то

//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 Ответ

4 голосов
/ 09 мая 2019

Означает ли оператор 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 ...
...