次のように、外部キーとブール値(およびここでは関係のない他の列の束)を持つテーブルがあります。
CREATE TABLE myTable
(
someKey integer,
someBool boolean
);
insert into myTable values (1, 't'),(1, 't'),(2, 'f'),(2, 't');
各 someKey は、0 個以上のエントリを持つことができます。特定の someKey について、a) すべてのエントリが true であるか、b) いずれかのエントリが false (基本的には 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 コンストラクトを使用することを検討しましたが、機能させることができませんでした...何かアイデアはありますか?