我有一个带有外键和布尔值的表(以及一堆在这里不相关的其他列),例如:
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 构造,但我无法让它工作......有什么想法吗?