Tengo una tabla con una clave externa y un valor booleano (y un montón de otras columnas que no son relevantes aquí), tales como:¿Cómo puedo realizar un AND en un número desconocido de booleanos en postgresql?
CREATE TABLE myTable
(
someKey integer,
someBool boolean
);
insert into myTable values (1, 't'),(1, 't'),(2, 'f'),(2, 't');
Cada someKey podría tener 0 o más entradas. Para cualquier clave dada, necesito saber si a) todas las entradas son verdaderas, o b) cualquiera de las entradas es falsa (básicamente una Y).
se me ha ocurrido con la siguiente función:
CREATE FUNCTION do_and(int4) RETURNS boolean AS
$func$
declare
rec record;
retVal boolean = 't'; -- necessary, or true is returned as null (it's weird)
begin
if not exists (select someKey from myTable where someKey = $1) then
return null; -- and because we had to initialise retVal, if no rows are found true would be returned
end if;
for rec in select someBool from myTable where someKey = $1 loop
retVal := rec.someBool AND retVal;
end loop;
return retVal;
end;
$func$ LANGUAGE 'plpgsql' VOLATILE;
... que da los resultados correctos:
select do_and(1) => t
select do_and(2) => f
select do_and(3) => null
Me pregunto si hay una manera mejor de hacer esto. No parece tan malo en este escenario simple, pero una vez que incluye todo el código de soporte, se vuelve más largo de lo que me gustaría. Eché un vistazo a lanzar la columna someBool a una matriz y utilizando la construcción ALL, pero no pude hacerlo funcionar ... ¿alguna idea?
es 'somebool' definido 'NOT NULL'? –