#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;