Saltar al contenido

Por qué las funciones agregadas en PostgreSQL no funcionan con el tipo de datos booleanos

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
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *