Как найти количество клиентов с NULL в столбце ID клиента в SQL
Что проверяют
Знаете ли вы, что NULL в SQL это не значение, а его отсутствие, и сравнение с ним работает иначе. Для тестировщика вопрос ещё и про смысл: клиент без ID уже похож на дефект данных. Следом часто просят посчитать то же без WHERE или найти заказы, у которых нет клиента.
Как отвечать
Базовый запрос:
SELECT COUNT(*) AS null_ids
FROM clients
WHERE client_id IS NULL;Дальше покажите, что понимаете механику:
IS NULLвместо=: выражениеclient_id = NULLдаёт неTRUE, аUNKNOWN, и строка в выборку не попадает. Запрос отработает без ошибки и вернёт ноль, это классическая ловушка;- *`COUNT()
противCOUNT(client_id)**: первый считает строки, второй только непустые значения. Поэтому пустые ID можно найти и без фильтра, вычтя изCOUNT(*)значениеCOUNT(client_id)`; - несколько метрик за один проход:
SUM(CASE WHEN client_id IS NULL THEN 1 ELSE 0 END), а в PostgreSQL корочеCOUNT(*) FILTER (WHERE client_id IS NULL); - пустые значения, которые не NULL: пустая строка, пробелы,
0. Если ID хранится строкой, добавьте условиеTRIM(client_id) = ''. В Oracle пустая строка сама становится NULL, в PostgreSQL и MySQL нет; - сироты: заказы, чей клиент не существует, ищутся через
LEFT JOIN clients c ON c.id = o.client_idс условиемc.id IS NULL. В результат попадут и строки с пустымclient_id, их стоит посчитать отдельно.
Закончите выводом тестировщика. Если client_id первичный ключ, NULL в нём быть не может, и найденные строки значат, что ограничения в схеме нет. Это повод завести дефект с запросом, количеством и примерами строк, а не просто назвать число.
Где спотыкаются
Пишут WHERE client_id = NULL или <> NULL и уверенно получают ноль.
Считают COUNT(client_id) с условием IS NULL и снова получают ноль: эта форма NULL не учитывает по определению.
Забывают про пустые строки и нули. Формально NULL нет, а клиентов без идентификатора в данных полно, и проверка пропускает дефект.