myCol
------
true
true
true
false
false
null
En la tabla anterior, si lo hago:
select count(*), count(myCol);
yo obtengo 6, 5
Obtengo 5
ya que no cuenta la entrada nula.
¿Cómo también cuento el número de valores verdaderos (3 en el ejemplo)?
(Esta es una simplificación y en realidad estoy usando una expresión mucho más complicada dentro de la función de conteo)
Editar resumen: también quiero incluir un recuento simple (*) en la consulta, por lo que no puedo usar una cláusula where
sql
postgresql
EoghanM
fuente
fuente
WHERE myCol = true
allí si lo desea y si elimina el primero*,
, simplemente devolverá el número.Respuestas:
o, como lo descubrió por sí mismo:
fuente
ELSE null
obtener el mismo resultado.Convierte el booleano en un número entero y suma.
Usted consigue
6,3
.fuente
Desde PostgreSQL 9.4 existe la
FILTER
cláusula , que permite una consulta muy concisa para contar los valores verdaderos:La consulta anterior es un mal ejemplo en el sentido de que una simple cláusula WHERE sería suficiente y es solo para demostrar la sintaxis. Donde brilla la cláusula FILTER es que es fácil de combinar con otros agregados:
La cláusula es especialmente útil para agregados en una columna que usa otra columna como predicado, mientras que permite obtener agregados filtrados de manera diferente en una sola consulta:
fuente
probablemente, el mejor enfoque es utilizar la función nullif.
en general
o en resumen
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
fuente
nullif([boolean expression], true)
devolveráfalse
si [expresión booleana] es falsa, ynull
si es verdadera, entonces estará contando los valores falsos. Creo que quieresnullif([boolean expression], false)
.nullif([boolean expression], false)
hace que sea mucho más fácil de leer. A continuación, puede variar la expresión booleana parte de ser lo que quiera, en este casomyCol = true
para contar los verdaderos valores, omyCol = false
para contar los falsos valores, oname='john'
para contar personas llamadas John etc.La solución más corta y perezosa (sin fundición) sería usar la fórmula:
Inténtalo tú mismo:
da el mismo resultado que
fuente
En MySQL, también puede hacer esto:
Creo que en Postgres, esto funciona:
o mejor (para evitar :: y usar la sintaxis SQL estándar):
fuente
O tal vez esto
fuente
myCol
expresión es un booleano, puede reemplazar el cheque conwhere (myCol)
Simplemente convierta el campo booleano en entero y haga una suma. Esto funcionará en postgresql:
¡Espero que ayude!
fuente
He aquí una forma con la función de ventana:
fuente
WHERE myCol = true
. Proporcioné el segundo ejemplo no porque sea más rápido, sino más como una pieza educativa de las funciones de ventana de Postgres, con las que muchos usuarios no se sienten cómodos o no conocen.agrupará los 3 estados posibles de bool (falso, verdadero, 0) en tres filas especialmente útiles cuando se agrupan con otra columna como día
fuente