2017-01-27 5 views
0

Мне действительно нужно объяснение для этого. Скажем, у вас есть следующая таблица:SQL count case else 0 vs null

Columns: 
id int(11) AI PK 
user_id int(11) 
is_complete int(11) 

В приведенной выше таблице is_complete может быть 1 или 0

Теперь вы хотите, чтобы сделать некоторый подсчет так вы создаете следующее SQL заявления:

COUNT(CASE 
    WHEN is_complete = 0 THEN 1 
    ELSE 0 
END) AS not_complete 

Сказать, что это будет:

enter image description here

(что неверно)

Теперь вы измените точно такое же заявление:

COUNT(CASE 
    WHEN is_complete = 0 THEN 1 
    ELSE null 
END) AS not_complete 

Примечание Айв изменил 0 к null

И вы получите следующий результат:

enter image description here

После некоторого интенсивного тестирования вы обнаружите, что 1. неверное утверждение действительно учитывает все, что бы ни было.

Мой вопрос: почему?

+1

Поскольку рассчитывает каждое значение, что это не пустой, то, как это работает. И '0' не является нулевым,' 1' не является нулевым, а каждое другое значение, но 'NULL' будет подсчитываться. Если вы хотите использовать 'THEN 1 ELSE 0 END', используйте' SUM' вместо 'COUNT' – Lamak

+0

So See Sum() ... – Strawberry

+0

почему вы не используете count (*) из таблицы where is_complete = 0 – Pirate

ответ

1

Count игнорирует нули, но не любые другие значения. Я думаю, что вы где думать о сумме:

COUNT(CASE 
    WHEN is_complete = 0 THEN 1 
    ELSE null 
END) AS not_complete 

Это как

SUM(CASE 
    WHEN is_complete = 0 THEN 1 
    ELSE 0 
END) AS not_complete 
1

Тонкость в том, что оператор COUNT рассчитывает на наличие значения. NULL вызывает удаление строки из COUNT; первая версия никогда не возвращает NULL, поэтому все строки включены. В результате подсчеты разные.

Вы могли бы выполнить сводку всех значений в таблице с помощью:

select is_complete,count(*) 
    from tablename 
group by is_complete