У меня есть таблица с внешним ключом и логическое значение (и куча других столбцов, которые не относятся здесь), как например:Как я могу выполнить И на неизвестном числе булевых в postgresql?
CREATE TABLE myTable
(
someKey integer,
someBool boolean
);
insert into myTable values (1, 't'),(1, 't'),(2, 'f'),(2, 't');
Каждый someKey может иметь 0 или больше записей. Для любого данного someKey мне нужно знать, являются ли: a) все записи истинными, или b) любая из записей ложна (в основном, AND).
я придумал следующую функцию:
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;
... который дает правильные результаты:
select do_and(1) => t
select do_and(2) => f
select do_and(3) => null
мне интересно, если есть лучше способ сделать это. В этом простом сценарии это выглядит не так уж и плохо, но как только вы включаете весь поддерживающий код, он становится длиннее, чем хотелось бы. Я посмотрел на то, чтобы отличать столбец someBool до массива и использовать конструкцию ALL, но я не мог заставить ее работать ... любые идеи?
Является 'somebool' определенный 'NOT NULL'? –