J'ai une table avec une clé étrangère et une valeur booléenne (et un tas d'autres colonnes qui ne sont pas pertinentes), en tant que tel:Comment puis-je effectuer un ET sur un nombre inconnu de booléens dans postgresql?
CREATE TABLE myTable
(
someKey integer,
someBool boolean
);
insert into myTable values (1, 't'),(1, 't'),(2, 'f'),(2, 't');
Chaque someKey pourrait avoir 0 ou plusieurs entrées. Pour une quelconque clé donnée, j'ai besoin de savoir si a) toutes les entrées sont vraies, ou b) si l'une des entrées est fausse (essentiellement un AND).
Je suis venu avec la fonction suivante:
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;
... qui donne des résultats corrects:
select do_and(1) => t
select do_and(2) => f
select do_and(3) => null
Je me demande s'il y a une plus belle façon de le faire. Cela ne semble pas trop mal dans ce scénario simple, mais une fois que vous incluez tout le code de support, il devient plus long que je ne le souhaite. J'ai jeté un oeil à la colonne someBool à un tableau et en utilisant la construction ALL, mais je ne pouvais pas le faire fonctionner ... des idées?
est 'somebool' défini 'NOT NULL'? –