Une instruction SELECT renvoie plusieurs lignes:
SELECT
ColA
FROM
TableA
WHERE
ColA IS NULL
J'obtiens 47 lignes qui ont "NULL" pour ColA dans TableA.
ColA
NULL
NULL
NULL
etc...
Si j'ajoute un agrégat à cette requête:
SELECT
ColA,
COUNT(ColA) AS theCount
FROM
TableA
WHERE
ColA IS NULL
GROUP BY ColA
Je reçois
ColA | theCount
NULL | 0
Pourquoi cela se produit-il et que puis-je faire pour éviter cela?
Les fonctions d'agrégation ignorent les valeurs nulles.
Donc
SELECT COUNT(cola) AS thecount
FROM tablea
est équivalent à
SELECT count(*) AS thecount
FROM tablea
WHERE cola IS NOT NULL;
Comme toutes vos valeurs sont nulles, count(cola)
doit retourner zéro.
Si vous voulez compter les lignes qui sont nulles, vous avez besoin de count(*)
SELECT cola,
count(*) AS theCount
FROM tablea
WHERE cola is null
GROUP BY cola;
Ou plus simple:
SELECT count(*) AS theCount
FROM tablea
WHERE cola is null;
Si vous souhaitez compter les valeurs NULL et NOT NULL dans une seule requête, utilisez:
SELECT count(cola) as not_null_count,
count(case when cola is null then 1 end) as null_count
FROM tablea;
C'est par conception.
COUNT(<expression>)
compte les lignes où <expression>
n'est pas nul.
COUNT(*)
compte les lignes.
Donc, si vous voulez compter les lignes, utilisez COUNT(*)
.