Нулевые значения SQL Count равны 0 даже при наличии нулевых значений

#sql #azure-sql-database #sql-null

#sql #azure-sql-database #sql-null

Вопрос:

В конкретном случае у меня есть таблица базы данных, заполненная 1070 элементами, и в какой-то момент процесса я добавляю в нее столбец с именем ‘Current_Status’. В результате у всех элементов появляется новое поле, которое изначально имеет значение NULL.

Эта таблица используется в качестве очереди, и для каждой обрабатываемой строки я обновляю поле ‘Current_Status’ на ‘Обработанный’ или ‘Необработанный’.

Чтобы увидеть, как продвигается процесс, я подсчитал оставшиеся элементы, которые все еще имели статус NULL, используя этот запрос:

 SELECT COUNT([Current_Status]) FROM Table_Name WHERE [Current_Status] IS NULL
  

Проблема в том, что после первых 1000 элементов результатом выполнения этого запроса было 0 , даже если я проверил и с помощью SELECT * FROM Table_Name запроса показал, что там все еще есть несколько строк со статусом NULL.

Есть идеи, что может быть причиной этого?

Я проверил эту ситуацию с помощью Azure Data Studio 1.4.5.

Ответ №1:

Причина этого в том, что вы предоставили count значение столбца, которое null . Вместо этого используйте count(*) :

 SELECT COUNT(*) FROM Table_Name WHERE [Current_Status] IS NULL
  

Пример данных:

 current_status
--------------
Processed
Null
Not Processed
Null
  

И разница между двумя запросами:

count(current_status)

 SELECT count(current_status) FROM table_name WHERE current_status IS NULL 

0
  

count(*)

 SELECT count(*) FROM table_name WHERE current_status IS NULL 

2
  

Комментарии:

1. Но проблема возникает, когда в столбце есть значения, отличные от null (почти все из них). Использование ‘*’ вместо этого решило бы проблему тогда?

Ответ №2:

С

 SELECT COUNT([Current_Status]) FROM Table_Name WHERE [Current_Status] IS NULL
  

вы говорите «возьмите все строки, где current_status равно null, и подсчитайте, сколько из них current_status не равно null». Что, конечно, равно нулю. COUNT(<expression>) подсчитывает ненулевые вхождения выражения.

Вместо этого вы хотите посчитать строки:

 SELECT COUNT(*) FROM table_name WHERE current_status IS NULL;
  

Или количество остается:

 SELECT COUNT(*) - COUNT(current_status) FROM table_name;