myCol
------
true
true
true
false
false
null
Na tabela acima, se eu fizer:
select count(*), count(myCol);
eu recebo 6, 5
Eu entendo 5
, pois não conta a entrada nula.
Como também conto o número de valores verdadeiros (3 no exemplo)?
(Esta é uma simplificação e, na verdade, estou usando uma expressão muito mais complicada na função de contagem)
Editar resumo: também quero incluir uma contagem simples (*) na consulta, portanto, não posso usar uma cláusula where
sql
postgresql
EoghanM
fonte
fonte
WHERE myCol = true
lá se quiser e se remover o primeiro,*,
ele apenas retornará o número.Respostas:
ou, como você descobriu por si mesmo:
fonte
ELSE null
para obter o mesmo resultado.Converta o Booleano em um número inteiro e some.
Você consegue
6,3
.fonte
Desde o PostgreSQL 9.4 existe a
FILTER
cláusula , que permite uma consulta muito concisa para contar os valores verdadeiros:A consulta acima é um mau exemplo, pois uma cláusula WHERE simples seria suficiente e serve apenas para demonstrar a sintaxe. O ponto forte da cláusula FILTER é que é fácil de combinar com outros agregados:
A cláusula é especialmente útil para agregados em uma coluna que usa outra coluna como predicado, enquanto permite buscar agregados filtrados de forma diferente em uma única consulta:
fonte
provavelmente, a melhor abordagem é usar a função nullif.
em geral
ou em suma
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
fonte
nullif([boolean expression], true)
retornaráfalse
se [expressão booleana] for falsa, enull
se for verdadeira, então você estará contando os valores falsos. Eu acho que você quernullif([boolean expression], false)
.nullif([boolean expression], false)
muito mais fácil de ler. Você pode então variar a parte da expressão booleana para ser o que quiser, neste casomyCol = true
para contar valores verdadeiros, oumyCol = false
para contar valores falsos, ouname='john'
para contar pessoas chamadas john etc.A solução mais curta e preguiçosa (sem fundir) seria usar a fórmula:
Tente você mesmo:
dá o mesmo resultado que
fonte
No MySQL, você também pode fazer isso:
Acho que no Postgres isso funciona:
ou melhor (para evitar :: e usar a sintaxe SQL padrão):
fonte
Ou talvez isso
fonte
myCol
expressão for um booleano, você pode substituir a verificação porwhere (myCol)
Basta converter o campo booleano em inteiro e fazer uma soma. Isso funcionará no postgresql:
Espero que ajude!
fonte
Esta é uma maneira de usar a função de janela:
fonte
WHERE myCol = true
. Forneci o segundo exemplo não porque seja mais rápido, mas mais como uma peça educacional para as funções de janelas do Postgres, com as quais muitos usuários não se sentem confortáveis ou não sabem.irá agrupar os 3 estados possíveis de bool (falso, verdadeiro, 0) em três linhas especialmente úteis ao agrupar junto com outra coluna como dia
fonte