web-dev-qa-db-fra.com

Pourquoi COUNT () agrégé retourne 0 pour 'NULL'?

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?

6
Zach Smith

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

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(*).

19
ypercubeᵀᴹ