2017-01-27 3 views
0

Ich brauche wirklich eine Erklärung dafür. Sagen Sie bitte die folgende Tabelle haben:SQL count case else 0 vs null

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

In der obigen Tabelle is_complete entweder 1 oder 0

Jetzt werden Sie wollen etwas Zählen zu tun, so dass Sie die folgende SQL Anweisung erstellen:

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

Angenommen, das Ergebnis wäre:

enter image description here

(was falsch ist)

Nun ändern Sie genau die gleiche Aussage:

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

Hinweis ive geändert 0 zu null

Und Sie erhalten folgendes Ergebnis:

enter image description here

Nach einigen intensiven Tests werden Sie feststellen, dass die 1. falsche Aussage tatsächlich zählt, egal was passiert.

Meine Frage ist warum?

+1

Da jeder Wert zählt, der nicht null ist, das ist, wie es funktioniert. Und "0" ist nicht null, "1" ist nicht null, und jeder andere Wert außer "NULL" wird gezählt. Wenn Sie 'THEN 1 ELSE 0 END 'verwenden möchten, verwenden Sie' SUM' anstelle von 'COUNT'. – Lamak

+0

Also siehe Summe() ... – Strawberry

+0

Warum verwenden Sie count (*) nicht aus der Tabelle where is_complete = 0 – Pirate

Antwort

1

Count ignoriert Nullen, aber keine anderen Werte. Ich glaube, Sie, wo über Summe denken:

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

Ist wie

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

Die Subtilität ist, weil die COUNT-Anweisung für die Anwesenheit eines Wertes zu zählen. NULL bewirkt, dass diese Zeile aus dem COUNT gelöscht wird; Die erste Version gibt NULL nie zurück, daher sind alle Zeilen enthalten. Infolgedessen sind die Zählungen unterschiedlich.

Sie können eine Zusammenfassung aller Werte in der Tabelle über führen:

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