Mam tabeli z kluczem obcym i wartości logicznej (i kilka innych kolumn, które nie mają znaczenia), jako takich:Jak mogę wykonać operację AND na nieznanej liczbie zmiennych logicznych w postgresql?
CREATE TABLE myTable
(
someKey integer,
someBool boolean
);
insert into myTable values (1, 't'),(1, 't'),(2, 'f'),(2, 't');
Każdy someKey może mieć 0 lub więcej wpisów. Dla każdego danego klucza, muszę wiedzieć, czy a) wszystkie wpisy są prawdziwe, lub b) którykolwiek z wpisów jest fałszywy (w zasadzie AND).
Doszedłem z następujących funkcji:
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;
... co daje poprawne wyniki:
select do_and(1) => t
select do_and(2) => f
select do_and(3) => null
Zastanawiam się, czy istnieje milszy sposób, aby to zrobić. W tym prostym scenariuszu nie wygląda to tak źle, ale gdy już weźmiesz pod uwagę cały kod pomocniczy, będzie on dłuższy niż ja. Rzuciłem okiem na rzucanie kolumny someBool do tablicy i używanie konstrukcji ALL, ale nie mogłem jej uruchomić ... żadnych pomysłów?
jest 'somebool' zdefiniowano "NOT NULL"? –