Solución:
Porque, por definición, VERDADERO es igual a 1 y FALSO es igual a 0, no entiendo por qué es necesario el casting.
Según los documentos que ha citado en su pregunta, un booleano no es, por definición, 1 para VERDADERO y 0 para FALSO. Tampoco es cierto en C, donde VERDADERO es cualquier cosa distinta de cero.
De hecho, tampoco lo es para lenguajes que imitan a C a este respecto, de los cuales hay muchos. Tampoco lo es para lenguajes como Ruby, donde todo lo que no sea Nil / no False se evalúa como Verdadero, incluidas las cadenas de cero y vacías. Tampoco lo es para el shell POSIX y sus variaciones, donde probar un código de retorno arroja VERDADERO si es cero y FALSO para cualquier cosa que no sea cero.
El punto es que un booleano es un booleano, con todo tipo de detalles coloridos de implementación de una plataforma a la siguiente; no un número entero.
No está claro cómo esperaba que Postgres promediara valores verdaderos / falsos. Sospecho que muchas, si alguna, plataformas darán un resultado para eso.
Incluso sumar booleanos es incómodo: ¿esperaría que Postgres O los valores de entrada, o cuente los valores VERDADEROS?
En cualquier caso, hay algunas funciones agregadas booleanas, a saber bool_or()
y bool_and()
. Estos reemplazan a los más estándar any()
y some()
. La razón por la que Postgres se desvía del estándar aquí se debe a una posible ambigüedad. Según los documentos:
SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;
Aquí, se puede considerar CUALQUIERA como la introducción de una subconsulta o como una función agregada, si la subconsulta devuelve una fila con un valor booleano.
http://www.postgresql.org/docs/current/static/functions-aggregate.html
Aquí tienes algunas posibilidades
select max(c::int)::boolean, min(c::int)::boolean, bool_or(c) as max_b,bool_and(c) as min_b from
(
select false as c
union select true
union select null
) t