138 votes

postgresql - sql - nombre de valeurs "vraies"

myCol
------
 true
 true
 true
 false
 false
 null

Dans le tableau ci-dessus, si je fais :

 select count(*), count(myCol);

J'obtiens 6, 5

J'obtiens 5 car il ne compte pas l'entrée nulle.

Comment compter également le nombre de vraies valeurs (3 dans l'exemple) ?

(C'est une simplification et j'utilise en fait une expression beaucoup plus compliquée dans la fonction count)

Modifier le résumé : je souhaite également inclure un nombre brut (*) dans la requête, je ne peux donc pas utiliser de clause where

178voto

Daniel Points 13823
SELECT COALESCE(sum(CASE WHEN myCol THEN 1 ELSE 0 END),0) FROM <table name>

ou, comme vous l'avez découvert par vous-même :

 SELECT count(CASE WHEN myCol THEN 1 END) FROM <table name>

111voto

Dwayne Towell Points 2768

Convertissez le booléen en un entier et une somme.

 SELECT count(*),sum(myCol::int);

Vous obtenez 6,3 .

48voto

wrobell Points 658

probablement, la meilleure approche consiste à utiliser la fonction nullif.

en général

 select
    count(nullif(myCol = false, true)),  -- count true values
    count(nullif(myCol = true, true)),   -- count false values
    count(myCol);

ou en bref

 select
    count(nullif(myCol, true)),  -- count false values
    count(nullif(myCol, false)), -- count true values
    count(myCol);

http://www.postgresql.org/docs/9.0/static/functions-conditional.html

28voto

Le Droid Points 455

La solution la plus courte et la plus paresseuse (sans lancer) serait d'utiliser la formule :

 SELECT COUNT(myCol OR NULL) FROM myTable;

Essayez vous-même :

 SELECT COUNT(x < 7 OR NULL)
   FROM GENERATE_SERIES(0,10) t(x);

donne le même résultat que

 SELECT SUM(CASE WHEN x < 7 THEN 1 ELSE 0 END)
   FROM GENERATE_SERIES(0,10) t(x);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X